Cookie、Session和Application的使用和区别

一. Cookie

1. Cookie的执行过程

Cookies是存储在客户机的文本文件,它们保存了大量轨迹信息。

  • 服务器脚本发送一系列cookies至浏览器。比如名字,年龄,ID号码等等。
  • 浏览器在本地机中存储这些信息,以备不时之需。
  • 当下一次浏览器发送任何请求至服务器时,它会同时将这些cookies信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。

2. Cookie的常用方法

Cookie对象的方法:

方法描述
public void setMaxAge(int expiry)设置cookie有效期,以秒为单位,默认有效期为当前session的存活时间, 到达时间后浏览器会自动删除cookie. 负值意味着 cookie 不会被持久存储,将在 Web 浏览器退出时删除。0 值会导致删除 cookie。
public String getName()返回 cookie的名称,名称创建后将不能被修改
public String getValue()获取cookie的值
public void setValue(String newValue)设置 cookie的值
public Cookie(String name, String value)Cookie类的构造器, 接受两个字符串作为键值对

request对象的方法:

response对象的方法:

方法描述
response.addCookie(cookie);将Cookie响应给客户端, 浏览器会将Cookie保存在本地

示例:

Cookie c = new Cookie("name","value");
c.setMaxAge(60);		// 设置最大有效时间为60秒
response.addCookie(c);	// 将Cookie响应给客户端

Cookie[] cs = request.getCookies();		// 获取请求中所有的Cookie对象的数组
for(Cookie c1 : cs){					// 遍历Cookie数组
    if("name".equals(c1.getName()){		// 通过键找到指定的Cookie对象
        String value = c1.getValue();	// 获取该Cookie对象的值
    }
}
  1. 会话Cookie和持久Cookie

    若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里

    若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie。

  2. Cookie具有不可跨域名性

    就是说,浏览器访问百度不会带上谷歌的cookie;不同浏览器之间的Cookie也无法共享

注意:

  • Cookie是存储在客户端本地的文件, 服务器无法操作该文件, 只能通过浏览器来操作
  • 因为Cookie最终是存储在客户端上的文本文件, 因此Cookie的键值对都是==String类型==
  • 在响应中添加Cookie要在重定向之前完成
  • 用户可以禁用cookie

二. Session(会话)

使用会话对象session实现, 一个会话就是浏览器与服务器之间的一次通话, 会话可以在多次请求中保存和使用数据

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录

在这里插入图片描述

session对象的一些重要方法:

方法说明
public Object getAttribute(String name)返回session对象中与指定名称绑定的对象,如果不存在则返回null
public String getId()返回session对象的ID
public int getMaxInactiveInterval()返回最大时间间隔,以秒为单位,只有在设置时间内未发送任何请求才会销毁,若有操作则重写计时
public void invalidate()将session无效化,解绑任何与该session绑定的对象
public void removeAttribute(String name)移除session中指定名称的对象
public void setAttribute(String name, Object value)使用指定的名称和值来产生一个对象并绑定到session中
public void setMaxInactiveInterval(int interval)用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效. Tomcat中的默认的超时时间是30分钟。
public boolean isNew()返回是否为一个新的客户端,或者客户端是否拒绝加入session

示例:

session.setAttribute("name", "value");		// 设置session

String v = (String)session.getAttribute("name");	// 注意: 返回得到的是Object类型的数据,需要强转

jsp自动启动session, 如果要设置关闭session功能, 如果如下设置:

<%@ session="false" %>

session的执行过程

用户第一次访问服务器时, 服务器端会为用户创建一个独立的session对象, 并且生成一个JSESSIONID, 这个JSESSIONID在响应浏览器的时候会被装进cookie中, 从而被保存到客户端浏览器的内存中去. 当用户再一次访问Servlet时, 请求中会携带着cookie中的JSESSIONID去访问服务器, 服务器会根据这个JSESSIONID去查看是否有对应的Session对象有就拿出来使用; 没有就创建一个Session(相当于用户第一次访问)

session何时被删除:

session在下列情况下被删除:

  • 程序调用session.invalidate()

  • 距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间

  • 服务器进程被停止

再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

设置session会话过期时间

  • 方法一

    public void setMaxInactiveInterval(int interval);		//单位是秒
    
  • 方法二:

    在Tomcat根目录的conf文件下的web.xml文件中配置服务器默认的会话过期时间

    <session-config>
    	<session-timeout>30</session-timeout>	<!-- 单位是分钟 -->
    </session-config>
    

注意:

  • Session在客户端第一次访问服务器创建时, 存储于服务器上, 服务器会将Session响应给客户端浏览器, 存储于客户端的内存中, 当客户端关闭了浏览器后, 客户端的Session及消失
  • 不同的浏览器之间, session并不通用
  • session存储与服务器上, 因此一个session键值对中的值是Object类型, 可以接受所有对象类型, 但是在获取值的时候要注意, 返回的也是一个Object对象, 需要做强制类型转换.
  • 重新打开浏览器或使用不同的浏览器,算一次新的会话
  • 客户端的JSESSIONID采用的是cookie技术, 存储在浏览器的内存中. 浏览器关闭后JSESSIONID也随之消失. 服务端的session, 并不会随浏览器关闭而消失,只有在一定时间内无操作才会消失

三. Cookie与Session的区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的内存性能,考虑到减轻服务器性能方面,应当使用cookie或者设置session的有效时间。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

四. Application

这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。

通过向application中添加属性,则所有组成该web应用的JSP文件都能访问到这些属性。整个项目中共享使用数据.

以下是在项目中创建变量的语法:

application.setAttribute(String Key, Object Value);

读取该变量的方法如下:

application.getAttribute(String Key);

注意:

  • application存储与服务器上, 因此一个application键值对中的值是Object类型, 可以接受所有对象类型, 但是在获取值的时候要注意, 返回的也是一个Object对象, 需要做强制类型转换.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值