2012-10-10 49 views
9

我有一个网络应用程序,在web.xml我已经添加了HttpSessionEventPublisher作为监听器。 Web应用程序在Jetty 7.x上运行,我们使用的是Spring 3.1.1。春季会话处理:HttpSessionDestroyedEvent没有收到

这应该是将HttpSessionCreatedEventHttpSessionDestroyedEvent激发到Spring上下文事件侦听器。

我有一个Bean(@Controller),它实现了ApplicationListener<ApplicationEvent>ApplicationEventHttpSessionCreatedEventHttpSessionDestroyedEvent的常用父级。当我现在登录到我的web应用程序或注销时,我希望这些事件被激发到onApplicationEvent(ApplicationEvent event)方法。我收到了其他事件,如某些请求处理事件,但预期的事件没有显示。我已经跟踪了一下这个应用,HttpSessionEventPublisher明确地将事件引发到了上下文中,但是没有接近听众。我在这里错过什么?

回答

8

问题是HttpSessionEventPublisher根据javadoc在“Spring Root WebApplicationContext”上发布了事件,这是通过0123.条目在web.xml文件中注册的应用程序上下文。另一方面,您的@Controller可能完全通过不同的应用程序上下文注册 - 通过DispatcherServlet注册的应用程序上下文。所以我建议你创建一个不同的ApplicationListener,将它注册到Root WebapplicationContext,这些事件应该通过。

0

面对类似的问题,如果无法将ApplicationListener移动到根上下文,则可以使用org.springframework.security.context.DelegatingApplicationListener。

就自动装配一个DelegatingApplicationListener在Bean中,并使用构造函数/ @PostConstruct来注册你的听众对DelegatingApplicationListener(一个应该由弹簧安全是已经到位)