1.什么是Cookie
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
2.服务端生成Cookie
保存在客户端
Cookie采用key:value的模式
创建Cookie
Cookie cookie = new Cookie("name","liang");
添加Cookie
response.add(cookie);
设置Cookie访问路径
//必须加上指定路径名
cookie.setPath(request.getContextPath()+"字定义路径名");
设置Cookie有效期
//单位为秒,整型值
//>0,将Cookie存到客户端的硬盘
// <0,与不设置效果相同,存在浏览器缓存
//=0,Cookie一生成,马上失效
cookie.setMaxAge(60*60);//1小时
3.服务端获取并解析Cookie
获取请求中的Cookie
Cookie[] cookies = request.getCookies();
4.域属性空间范围对比
- ServletContext(application):置入其中的域属性是整个应用范围的,可以完成跨会话共享数据。
- HttpSession,置入其中域属性是会话范围的,可以完成跨请求共享数据。
- HttpServletRequest,置入其中的域属性是请求范围的,可以完成跨Servlet共享数据,但是Servlet都必须在同一请求中。
使用原则:
保证需求前提下,优先使用小范围的,节省空间,保证安全。
HttpSession
1.什么是session
即会话,和Cookie区别是,Session保存在服务端,Cookie在客户端。
2.创建Session
- getSession():如果当前请求没有Session,则创建一个Session
- getSession(boolean create);如果当前请求没有Session,并且create是true,则创建一个。
使用原则: - 要向Session写入数据->getSession(true)
- 要向Session读取数据->getSession(false)
3.Session域属性空间的操作
Session是一个专门存放数据的集合,称存放数据的空间为域属性空间。
方法: - setAttribute(String name,Object value):向Session的域属性空间放入指定名称、指定值的域属性。
- getAttribute(String name):从Session的域属性空间取出指定名称的域属性。
- removeAttribute(String name):从Session的域属性空间删除指定名称的域属性。
4.Session的工作原理
在服务器中系统会为每一个会话维护一个Session,不同的会话,对应不同的Session。
系统如何区分Session?
(1)写入Session列表
当前应用中的Session是以Map形式管理的,这个Map成为Session的列表。该Map的key是一个32位长度的随机字符串,成为JSessionID,value为Session对象的引用。
(2)服务器生成并发送Cookie
在将Session信息写入Session列表后,系统自动将"JSessionID"作为name,这个32位长度随机字符串作为value,以Cookie的形式放在响应报头,并随着响应,将该Cookie发送到客户端。
(3)客户端接收并发送Cookie - 客户端接受到Cookie将其存入浏览器缓存,只要浏览器不关闭,浏览器缓存中的Cookie就不会消失。
- 当用户调教第二次请求时,会将缓存的Cookie,伴随着请求的头部信息,一块发送到服务端。
(4)从Session列表中
服务端从请求中读取到客户端发送过来的Cookie,并根据Cookie中的JSessionID的值,从Map中查找相应的key对应的value,即Session对象,对该Session对象的域属性空间进行读写操作。
5.Session的失效
在web.xm中可以通过标签设置超时时间,默认30分钟。
需要强调的是:
时间并不是从Session被创建开始计时的生命周期时长,而是从最后一次访问开始计时。
<session-config>
<session-timeout>120</session-timeout>
</session-config>
若未到超时时限,可以通过代码提前使Session失效,即使用invalidate()。