HTT协议本身P是无状态的,服务器无法区分两次请求是否是同一个客户端发送过来的。所以两个用户操作时,便会产生数据错误。因此通过会话跟踪技术来解决这个问题。
1. Cookie
1.1 本质
- 在浏览器端临时存储数据
- 键值对
- 键和值都是字符串类型
- 数据量很小
1.2 Cookie在浏览器和服务器之间的传递
1.2.1 没有Cookie的状态
在服务器端没有创建Cookie并返回的情况下,浏览器端不会保存Cookie信息。双方在请求和响应的过程中也不会携带Cookie的数据。
1.2.2 创建Cookie对象并返回
1.2.3 浏览器拿到Cookie之后
浏览器拿到Cookie之后,以后的每一个请求都会携带Cookie信息。
1.2.4 服务器端读取Cookie的信息
1.3 Cookie时效性
- 会话级Cookie
- 服务器端并没有明确指定Cookie的存在时间
- 在浏览器端,Cookie数据存在于内存中
- 只要浏览器还开着,Cookie数据就一直都在
- 浏览器关闭,内存中的Cookie数据就会被释放
- 持久化Cookie
- 服务器端明确设置了Cookie的存在时间
- 在浏览器端,Cookie数据会被保存到硬盘上
- Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
- 持久化Cookie到达了预设的时间会被释放
2. Session
Session是用来维护客户端与服务器端关联的一种技术,每个客户端都有自己的一个Session会话,Session会话会话中经常用来保存用户登录后的信息。
2.1 流程
- 服务器端没调用request.getSession()方法:什么都不会发生
- 服务器端调用了request.getSession()方法
- 服务器端检查当前请求中是否携带了sessionId的Cookie
- 有:根据sessionId在服务器端查找对应的HttpSession对象
- 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回
- 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
- 无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
- 有:根据sessionId在服务器端查找对应的HttpSession对象
- 服务器端检查当前请求中是否携带了sessionId的Cookie
2.2 代码
2.3 时效性
2.3.1 为什么Session要设置时限
用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。
2.3.2 设置时限的难点
从服务器端的角度,很难精确得知类似浏览器关闭的动作。而且即使浏览器一直没有关闭,也不代表用户仍然在使用。
2.3.3 服务器端给Session对象设置最大闲置时间
默认值:1800秒
最大闲置时间生效的机制如下:
2.3.4 代码
2.3.5 强制Session立即失效
session.invalidate();
© 版权声明
THE END
暂无评论内容