内容导航

  • 前言
  • 1、会话为什么要失效
  • 2、容器自动销毁会话对象
  • 3、在web.xml中配置会话失效时间

前言


1、会话为什么要失效

会话对象是容器创建的,并保存在容器中。

如果客户端连接到服务器后,却置之不理,不做任何操作,那么容器维护这些会话对象将占用很多资源。因此,容器都会在默认时间内销毁会话对象,多数容器默认30分钟销毁会话对象。

2、容器自动销毁会话对象

多数容器会在会话对象闲置30分钟后自动销毁。所谓闲置,就是没有使用Session对象。Tomcat默认30分钟后销毁。
测试:
1、登录后,访问admin.jsp页面,成功访问
2、修改系统时间,为当前时间的30分钟后
3、再次直接访问admin.jsp,跳转到登录页面,说明会话对象已经被销毁,所以admin.jsp中的会话是新的会话对象,取不到username,因此访问失败

3、在web.xml中配置会话失效时间

多数容器会在会话对象闲置30分钟后自动销毁。可以在web.xml中进行配置,修改默认时间。例如,修改为50分钟销毁。

<session-config>
  <session-timeout>50</session-timeout>
</session-config>

测试:
1、登录后,访问admin.jsp页面,成功访问
2、修改系统时间,为当前时间的30分钟后
3、再次直接访问admin.jsp,依然能够成功访问。
4、修改系统时间,为当前时间的50分钟后,跳转到登录页面,说明50分钟后会话对象已经被销毁,所以admin.jsp中的会话是新的会话对象,取不到username,因此访问失败

使用setMaxInactiveInterval设置最长有效时间

在web.xml中配置的是该应用下所有会话对象的有效时长,如果需要对特定会话对象设置特定的有效时间,可以使用HttpSession接口中的setMaxIntervalTime设置,以秒为单位,如果参数是负数,表示永远不失效。例如,在LoginServlet中,将会话的有效时长设置为2小时。
session.setMaxInactiveInterval(26060);
测试:1、登录后,访问admin.jsp页面,成功访问
2、修改系统时间,为当前时间的30分钟后
3、再次直接访问admin.jsp,依然能够成功访问。
4、修改系统时间,为当前时间的50分钟后,需要登录访问。
如果用多种方法设置会话的有效时间,以较小时间为准。

调用invalidate方法使会话失效

除了根据有效时间使会话失效外,还可以调用HttpSession中的invalidate方法,使会话失效。

主要区别:

  • 通过setMaxIntervalTime,或者web.xml配置,或者容器默认时间,都是根据会话闲置时间,容器自动销毁会话
  • 调用invalidate方法,是立即销毁会话对象