摘要:本文学习了Session的原理和使用方法。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
Tomcat 8.5.50
1 简介
使用Cookie有一个非常大的局限,就是如果Cookie很多,就会增加客户端与服务端的数据传输量。而且浏览器对Cookie数量有限制,不能在Cookie中保存过多的信息,于是Session出现了。
Session是在服务器端保存用户的数据,创建Session时会自动创建名为JSESSIONID值为Session唯一标识的Cookie对象,并将此Cookie对象响应给浏览器。
后续请求相同服务时,浏览器会自动将Cookie对象附加在请求头Cookie中发送给服务端,服务端根据Cookie信息中的JSESSIONID值找到对应的Session对象,从而识别同一会话。
2 简单使用
获取Session对象并使用:
1 | HttpSession session = req.getSession(); |
3 常用设置
3.1 设置时效
失效场景:
- 自动超时,从最后一次访问开始计时。
- 手动调用,手动执行
invalidate()方法。 - 服务因各种原因导致重启。
设置代码层面的时效,优先级最高,传入秒数:
1 | public void setMaxInactiveInterval(int interval); |
说明:
- 设置为正数时,在指定秒数后失效。
- 设置为0或负数时,永不过期。
设置应用级别的时效,优先级次之,在Web应用根目录的WEB-INF/web.xml配置文件中设置,传入分钟数:
1 | <session-config> |
设置容器级别的时效,优先级最低,Tomcat默认30分钟,在Tomcat安装目录的conf/web.xml配置文件中设置,传入分钟数:
1 | <session-config> |
3.2 URL重写
在整个会话控制技术体系中,保持JSESSIONID的值主要通过Cookie实现,但Cookie在浏览器端可能会被禁用,所以需要使用URL重写保持会话状态。
URL重写其实就是将JSESSIONID的值以固定格式附着在URL地址后面,实现保持会话状态的目的,缺点是存在安全隐患,会导致JSESSIONID在地址栏暴露,不建议使用。
3.3 钝化和活化
概念:
- 钝化(Passivate):将会话对象从内存序列化到磁盘。
- 活化(Activate):将会话对象从磁盘反序列化到内存。
钝化条件:
- 对象需要实现
java.io.Serializable接口,如果对象中存在其他对象引用类型的属性,关联对象也需要实现java.io.Serializable接口。 - 服务器正常关闭时触发钝化,通过服务器的停止脚本关闭服务器会触发钝化,强制杀死服务器进程和热部署均不会触发钝化。
- 服务器中Session的数量超过限制时,会触发钝化。
活化条件:
- 服务器启动时触发活化。
条