9

我有一个网络应用程序,其中web.xml我添加了HttpSessionEventPublisher作为侦听器。Web 应用程序在 Jetty 7.x 上运行,我们使用的是 Spring 3.1.1。

这应该触发HttpSessionCreatedEventHttpSessionDestroyedEventSpring 上下文事件侦听器。

我有一个@Controller实现ApplicationListener<ApplicationEvent>. 是和ApplicationEvent的公共父类。当我现在登录到我的 Web 应用程序或从中注销时,我希望这些事件会被触发到该方法。我收到了其他事件,比如一些请求处理事件,但预期的事件没有出现。我已经稍微跟踪了应用程序,肯定会触发事件到上下文,但没有接近侦听器。我在这里想念什么?HttpSessionCreatedEventHttpSessionDestroyedEventonApplicationEvent(ApplicationEvent event)HttpSessionEventPublisher

4

2 回答 2

8

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

于 2012-10-10T00:36:02.407 回答
0

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

只需在您的 Bean 中自动装配一个 DelegatingApplicationListener 并使用构造函数/@PostConstruct 将您的侦听器注册到 DelegatingApplicationListener(spring-security 应该已经到位)

于 2017-05-11T08:45:36.967 回答