我有一个web应用程序,我在web.xml中添加了HttpSessionEventPublisher作为侦听器。web应用程序运行在Jetty 7.x上,我们使用的是Spring 3.1.1。
这应该会将HttpSessionCreatedEvent和HttpSessionDestroyedEvent触发到Spring上下文事件侦听器。
我有一个实现ApplicationListener<ApplicationEvent>的Bean (@Controller)。ApplicationEvent是HttpSessionCreatedEvent和HttpSessionDestroyedEvent的共同父类。当我现在登录到我的web应用程序或从它注销时,我希望这些事件会被触发到onApplicationEvent(ApplicationEvent event)方法。我还收到了其他事件,比如一些请求处理事件,但预期的事件没有出现。我对这个应用程序进行了一点跟踪,HttpSessionEventPublisher肯定会将事件触发到上下文中,但不会接触到侦听器。我在这里错过了什么?
发布于 2012-10-10 08:36:02
问题是HttpSessionEventPublisher在每个javadoc的"Spring Root WebApplicationContext“上发布事件,这是通过web.xml文件中的ContextLoaderListener条目注册的应用程序上下文。另一方面,您的@Controller可能是通过完全不同的应用程序上下文注册的-通过DispatcherServlet注册的应用程序上下文。因此,我建议您创建一个不同的ApplicationListener,将其注册到根WebapplicationContext,然后事件应该会通过。
发布于 2017-05-11 16:45:37
面对类似的问题,如果不能将ApplicationListener移到根上下文,您可以使用org.springframework.security.context.DelegatingApplicationListener.
只需在Bean中自动连接一个DelegatingApplicationListener,并使用构造函数/ @PostConstruct根据DelegatingApplicationListener注册您的侦听器(spring-security应该已经准备好了)
https://stackoverflow.com/questions/12810153
复制相似问题