内容导航:
- 前言
- 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方法,是立即销毁会话对象