由于HTTP协议的无状态性,web服务器无法直接处理跨多个请求保留与客户的会话状态的情况,一种比较好的解决方法是使用本章所用的会话管理。
本章内容
- 将对象保存到会话对象中,并从会话对象中读取对象
- 何时创建、销毁会话对象,销毁会话对象使用什么机制
- 使用会话监听者
- Web容器采用的会话管理机制,cookie的使用以及使用URL重写
1,HttpSession
HttpSession对象可以保存跨同一个客户多个请求的会话状态。对与客户的第一个请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户,客户再在以后的每个请求中发回这个ID,容器看到ID后,就会找到匹配的会话,并把这个会话与请求关联。
问题:客户和容器如何交换会话ID信息??
cookie。cookie是请求中的另一个首部。生成会话ID、创建新的cookie对象、把会话ID放到 cookie中、把cookie设置为响应的一部分等工作都由容器完成。容器会从请求的cookie中得到会话ID,将这个会话ID与一个现有的会话匹配,并把会话与当前请求关联。
在响应中发送一个会话cookie并且从请求中得到会话ID:
HttpSession session = request.getSession();
IF(请求包含一个会话ID cookie)
找到与该ID匹配的会话
ELSE IF(没有找到会话ID cookie OR 没有与此会话ID匹配的当前会话)
创建一个新会话
cookie所有的工作都在后台进行
判断当前会话是否是一个新会话的方法:
if(session.isNew())
getSession(false)
要么返回null,要么返回一个已有的HttpSession。
问题:如果客户端禁用cookie?
2,URL重写
当不能不会话ID加在cookie中的时候,URL重写可以取得至于cookie中的会话ID,并把会话ID 附加到访问应用的各个URL的最后
如果对URL实现了显示的编码,容器会首先尝试使用cookie来完成会话管理,当cookie方法不行时会转向URL重写。
容器确定cookie是否正常工作以及决定重写URL的办法:
容器看到一个getSession()调用,但是没有从客户的请求中得到会话ID,容器就知道它必须尝试与客户建立一个新的会话。此时容器并不知道cookie是否工作,所以向客户返回第一个响应时,它会同时尝试cookie和URL重写这两种做法。
3,撤销会话
会话的三种“死”法:
- 超时
- 在会话对象上调用invalidatte()方法–手动撤销。
- 应用结束(崩溃或取消部署)