当session超时时,会调用httpSessionListener中的sessionDestroy()方法。
html
具体设置方法有三种:java
(1)在主页面或者公共页面中加入:session.setMaxInactiveInterval(900);能够经过对应的getMaxInactiveInterval()获取。参数900单位是秒,即在没有活动15分钟后,session将失效。另外,经过调用Session的invalidate()方法可使Session显示失效。web
这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。因此若是是在调试程序,应该是修改服务器端时间来测试,而不是客户端。spring
(2)也是比较通用的设置session失效时间的方法,就是在项目的web.xml中添加Xml代码服务器
session-config :若是某个会话在必定时间内未被访问,服务器能够抛弃它以节省内存。session
可经过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,app
或者可利用session-config元素制定缺省超时值。框架
<!-- session-config包含一个子元素session-timeout.定义web站台中的session参数. --> <session-config> <!-- 定义这个web站台全部session的有效期限.单位为分钟. 例子中为600分钟 --> <session-timeout>600</session-timeout> </session-config>
在通常系统中,也可能须要在session失效后作一些操做,性能
(1)控制用户数,当session失效后,系统的用户数减小一个等,控制用户数在必定范围内,确保系统的性能。测试
(2)控制一个用户屡次登陆,当session有效时,若是相同用户登陆,就提示已经登陆了,当session失效后,就能够不用提示,直接登陆了。
那么如何在session失效后,进行一系列的操做呢?
这里就须要用到监听器了,即当session由于各类缘由失效后,监听器就能够监听到,而后执行监听器中定义好的程序就能够了。
监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法
本身能够继承这个类,而后分别实现。
sessionCreated指在session建立时执行的方法
sessionDestroyed指在session失效时执行的方法
package com.yuan.Session; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { // session建立时执行 SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms"); String nowtimes = simpleFormat.format(new Date()); //User u = (User)ActionContext.getContext().getSession().get("user");//structs的方法 //String username = (String)se.getSession().getAttribute("username");//用于获取元素,对象 System.out.println("执行。。 当前时间:"+nowtimes+"); HttpSession ses= se.getSession(); String id=ses.getId()+"_"+ses.getCreationTime(); } public void sessionDestroyed(HttpSessionEvent arg0) { // session失效时执行 SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms"); String nowtimes = simpleFormat.format(new Date()); System.out.println("session失效时间: "+nowtimes); } }
这样的代码在传统的Servlet程序中是很常见的:由于使用了 Servlet API,从而对 Servlet API产生依赖。这样若是咱们要测试 action,咱们就必须针对 HttpServletRequest、HttpServletResponse 和 HttpSession类提供 mock 或者 stub 实现。固然如今已经有不少开源的 Servlet 测试框架帮助咱们减轻这个痛苦,包括 Spring 就自带了对了这些类的 stub 实现,但那仍是太冗繁琐碎了。那有没有比较好的办法来让咱们的 controller 更 POJO,让咱们的 action 脱离 Servlet API 依赖,更有益于测试和复用呢?咱们来看看在 Spring2.5 中访问 Session 属性的几种解决方案,并将在本博的后续文章继续探究解决方案选择背后的深层含义。
备注:感受测试会有问题,比较麻烦。
参考博文:能够查看该博文读取详细内容
Spring对annotationed的 action 的参数提供自动绑定支持的参数类型包括 Servlet API 里面的 Request/Response/HttpSession(包含Request、Response在Servlet API 中声明的具体子类)。因而开发人员能够经过在 action 参数中声明 Request 对象或者 HttpSession 对象,来让容器注入相应的对象。
action 的代码以下:
Java代码
@RequestMapping public void hello(HttpSession session){ User user = (User)session.getAttribute("currentUser"); //... }