在Spring 3 / Spring Security 2.0.5中检测会话超时

我有一个使用SpringSecurity 2.0.5在Spring 3下运行的Web应用程序。 为了向用户呈现自上次访问以来对站点的更改,我尝试记录其会话被销毁的时间。 因此,我注册了org.springframework.context.ApplicationListener以及javax.servlet.http.HttpSessionListener 。 当用户使用注销链接时,实现的方法有效。 但是当会话超时时,就好像事件没有生成一样。

我忘了听正确的事吗? 或者会话超时没有解雇? 有没有其他方法来实现这一目标? 它取决于服务器设置(tomcat 6.0.24 btw)吗?

我不做Spring,所以没有关于此的措辞,但javax.servlet.http.HttpSessionListener应该在实现和正确注册时工作。 您需要在web.xml中将其注册为 ,如下所示:

  com.example.MyHttpSessionListener  

请记住,您正在以正确的方式测试会话超时。 例如,关闭webbrowser窗口不会立即破坏服务器端的会话。 只要客户端在30分钟内未发送任何HTTP请求,会话就会生效。 这30分钟是默认会话超时,可由web.xml 条目配置。

此外,servletcontainer在完全超时值后不会立即销毁会话。 这是一个后台工作,以一定的时间间隔运行(例如5到15分钟,具体取决于负载和servletcontainer品牌/类型)。 所以当你没有看到在30分钟不活动后调用sessionDestroyed()方法时,不要感到惊讶。 但是,当您在超时但未被破坏的会话上触发HTTP请求时,它将立即被销毁。

也可以看看:

  • Servlets,ServletContext,HttpSession等如何工作?

我认为,DelegatingSessionListener方法可能很有用。 它已经在这里提到:

如何使用Spring将依赖项注入HttpSessionListener?