5.1会话概述
1.会话
用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
2.会话跟踪
回顾之前的servlet,每次会话的内容都不会被记录。而会话跟踪会管理浏览器和服务器端之间会话过程中产生的会话数据,即记录会话的内容,常见的会话跟踪技术有Cookie和Session
5.2 Cookie对象
注意事项:
- cookie被存储在客户端(浏览器端),浏览器发送请求时会将cookie一同发给服务器。
- cookie隶属于整个web项目,一个servlet创建的cookie,其他所有servlet能对其进行范文或修改
- cookie默认是会话级别cookie,通过setMaxAge后才能让它关闭浏览器后还存在。
- 例子见chapter05项目
5.3 Session对象
1.原理:
- 浏览器第一次访问服务器——>服务器会新建一个Session,在该Session对象中保存会话数据——>服务器创建一个保存了SessionId的cookie并发给浏览器——>浏览器保存这个cookie对象
- 浏览器再次访问服务器时——>往服务器发送SessionId的Cookie对象——>服务器根据该Cookie对象的SessionId值查询对应的Session对象,然后再取出会话数据。
注意事项:
- cookie被存储在服务器,ession对象和会话数据都是保存再服务器端的,对应SessionId的cookie对象就是服务器端分配给浏览器的一把钥匙,一把用于取双方会话数据的钥匙。
2.生命周期
1 客户关闭浏览器,表示一次会话结束,Session对象生命周期结束。
2 调用HttpSession 的 invalidate()方法,可以结束HttpSession对象生命周期。
3 两次访问服务器的时间间隔大于session定义的最大的非活动时间间隔,也会结束session。
3.涉及的方法
URL重写:如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把会话ID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户,将Session的会话标识号以参数的形式附加在超链接URL地址后面。
//未经过重写
String url = "/chapter05/PurchaseServlet?id=" + book.getId();
out.write(book.getName() + "<a href='" + url + "'>点击购买</a><br>");
可以从源码中看到,如果未重写,则链接为"/chapter05/PurchaseServlet?id=1",一旦浏览器禁用Cookie,即直接点击这个链接是无法将包含SessionID的Cookie传给服务器,服务器也就无法提供记录在session中的内容。
//重写后
String url = "/chapter05/PurchaseServlet?id=" + book.getId();//?id作为请求参数,这里是书的id
//URL重写,先用req.getSession()方法,然后再通过resp.encodeRedirectURL()完成重写
HttpSession s=req.getSession();
String newUrl=resp.encodeRedirectURL(url);
out.write(book.getName() + "<a href='" + newUrl + "'>点击购买</a><br>");//显示图书列表,并提供购买链接
可以从源代码中看到,重写后,链接为’/chapter05/PurchaseServlet;jsessionid=C93349520DB5CBDBAAC204D5E8DFC9D2?id=1’,已经将Session的会话标识号以参数的形式附加在超链接URL地址后面,不管浏览器是否禁用Cookie,直接点击这个链接是就能将包含SessionID的Cookie传给服务器,服务器会提供记录在session中的内容。