目录
1. 会话技术概念
识别客户端的状态,帮助服务器记住/区分客户端状态。
会话: 浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止,客户端和服务器端通信/连接的建立,称为一次会话。 一次会话, 会有多个请求和响应。
会话技术: 记录会话中客户端的状态和数据。在一次会话的范围内的多次请求间共享数据。
范围:request > 会话技术 > ServletContext
方式:
- 客户端会话技术: Cookie
数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookie。
- 服务器端会话技术: Session
将数据存储到服务器端,安全性相对好,增加服务器的压力。
2. Cookie技术
将用户的数据存储到客户端的技术, 只支持 String 类型的数据。
- 创建,绑定数据:Cookie cookie = new Cookie("username","zhangsan");
- 发送:response.addCookie(cookie);
- 获取:Cookie[] cookies = request.getCookies();
- 存储:服务器通过 response 头(set-cookie) 将数据发送给客户端
cookie的生命周期: 一次会话(会话结束浏览器关闭后, cookie数据被销毁)
修改cookie的持久化时间:setMaxAge(int)
- 携带: 只要向服务器发送请求,客户端有服务器对应的cookie,就会自动由 request 头(cookie) 发送给服务器
setPath(uri):设置携带路径(cookie的获取范围),默认的携带路径是同一个目录中的所有资源
共享问题:可将path设置为 “ / ”
3. Session技术
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,客户端需要每次都携带一个标识ID,去服务器中寻找属于自己的内存空间。
Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID。
3.1 获得session
HttpSession session = request.getSession();
原理: 在访问session的时候, 服务器端会查看客户端有没有携带JSESSIONID的cookie过来
- 没有携带JSESSIONID,判断客户端是第一次访问session,创建一个session对象,每一个session对象都会有一个唯一的编号 JSESSIONID,将JSESSIONID 添加到cookie中,返回给客户端保存。
- 携带JSESSIONID,判断有没有对应的session对象,有就直接将之前的session返回。
结论: session底层实现需要依赖于cookie
3.2 使用HttpSession对象
- Object getAttribute(String name)
- void setAttribute(String name, Object value)
- void removeAttribute(String name)
3.3 实现JSESSIONID持久化
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setPath(request.getContextPath());
cookie.setMaxAge(60 * 60 * 24);
response.addCookie(cookie);
3.4 生命周期
- 创建:第一次调用request.getSession()方法时
- 销毁:会话结束,session实际是没有被销毁的
1. 服务器非正常关闭
2. 手动销毁 session.invalidate();
3. 默认失效时间销毁, 默认配置在web.xml
<session-config>
<session-timeout>1</session-timeout>
</session-config>
3.5 session的钝化和活化
- 服务器关闭后,session对象一定是从内存中释放掉了。
- session数据持久化(钝化):将数据从内存保存到tomcat/work/应用/session文件。
- 服务器开启后(活化):session数据 从文件中还原到了内存中。
服务器重启后, session已经不是原来的对象了, 只是数据进行了还原
4. cookie和session的优劣势
- cookie:存储数据在客户端,有数据大小限制,只能存储字符串类型数据,数据不安全。
- session:存储在服务器端,可以存储任意类型、大小的数据,数据安全。