我有一个使用SpringSecurity 2.0.5在Spring 3下运行的Web应用程序。
为了向用户呈现自上次访问以来对站点的更改,我尝试记录其会话被销毁的时间。因此,我注册了org.springframework.context.ApplicationListener<HttpSessionDestroyedEvent>
和javax.servlet.http.HttpSessionListener
。
当用户使用注销链接时,实现的方法有效。但是当会话超时时就好像事件没有生成一样。
我忘了听正确的事吗?或者会话超时没有解雇?有没有其他方法来实现这一目标?它取决于服务器设置(tomcat 6.0.24 btw)吗?
答案 0 :(得分:14)
我不做Spring,所以没有关于此的措辞,但javax.servlet.http.HttpSessionListener
应该在实现和正确注册时起作用。您需要在<listener>
中将其注册为web.xml
,如下所示:
<listener>
<listener-class>com.example.MyHttpSessionListener</listener-class>
</listener>
请记住,您正在以正确的方式测试会话超时。例如,关闭webbrowser窗口不会立即销毁服务器端的会话。只要客户端在30分钟内未发送任何HTTP请求,会话就会生效。这30分钟是默认会话超时,可以通过<session-timeout>
中的web.xml
条目进行配置。
此外,servletcontainer在完全超时值后不会立即销毁会话。这是一个后台工作,它以一定的间隔运行(例如5到15分钟,具体取决于负载和servletcontainer品牌/类型)。因此,如果在完全 30分钟不活动后没有看到sessionDestroyed()
方法被调用,请不要感到惊讶。但是,当您在超时但未被破坏的会话中触发HTTP请求时,它将立即被销毁。
答案 1 :(得分:2)
我认为,DelegatingSessionListener方法可能很有用。它已在此处提及:
How to inject dependencies into HttpSessionListener, using Spring?