抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了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对象并使用:

java
1
2
3
4
5
6
HttpSession session = req.getSession();
Object user = session.getAttribute("name");
System.out.println("name:" + user);
if (user == null) {
session.setAttribute("name", "lisi");
}

3 常用设置

3.1 设置时效

失效场景:

  • 自动超时,从最后一次访问开始计时。
  • 手动调用,手动执行invalidate()方法。
  • 服务因各种原因导致重启。

设置代码层面的时效,优先级最高,传入秒数:

java
1
public void setMaxInactiveInterval(int interval);

说明:

  • 设置为正数时,在指定秒数后失效。
  • 设置为0或负数时,永不过期。

设置应用级别的时效,优先级次之,在Web应用根目录的WEB-INF/web.xml配置文件中设置,传入分钟数:

web.xml
1
2
3
<session-config>
<session-timeout>30</session-timeout>
</session-config>

设置容器级别的时效,优先级最低,Tomcat默认30分钟,在Tomcat安装目录的conf/web.xml配置文件中设置,传入分钟数:

web.xml
1
2
3
<session-config>
<session-timeout>30</session-timeout>
</session-config>

3.2 URL重写

在整个会话控制技术体系中,保持JSESSIONID的值主要通过Cookie实现,但Cookie在浏览器端可能会被禁用,所以需要使用URL重写保持会话状态。

URL重写其实就是将JSESSIONID的值以固定格式附着在URL地址后面,实现保持会话状态的目的,缺点是存在安全隐患,会导致JSESSIONID在地址栏暴露,不建议使用。

3.3 钝化和活化

概念:

  • 钝化(Passivate):将会话对象从内存序列化到磁盘。
  • 活化(Activate):将会话对象从磁盘反序列化到内存。

钝化条件:

  • 对象需要实现java.io.Serializable接口,如果对象中存在其他对象引用类型的属性,关联对象也需要实现java.io.Serializable接口。
  • 服务器正常关闭时触发钝化,通过服务器的停止脚本关闭服务器会触发钝化,强制杀死服务器进程和热部署均不会触发钝化。
  • 服务器中Session的数量超过限制时,会触发钝化。

活化条件:

  • 服务器启动时触发活化。

评论