Spring 3.5如何将HttpSessionEventPublisher添加到我的启动配置中

时间:2014-07-25 12:11:36

标签: java spring spring-mvc

我想听会话生命周期事件。我读到了关于添加

的内容
<listener>
   <listener-class>
     org.springframework.security.web.session.HttpSessionEventPublisher
   </listener-class>
</listener>

到web.xml。但我没有。我正在使用扩展SpringBootServletInitializer的类。我如何添加这个监听器?

5 个答案:

答案 0 :(得分:16)

您可以使用ServletListenerRegistrationBean

@Bean
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
    return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
}

答案 1 :(得分:0)

在Class中添加可以扩展SpringBootSelvletInitializer的Listener,如下所示。

    @Configuration
    public class Application extends SpringBootServletInitializer {

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    SpringApplicationBuilder app=application.sources(Application.class, ComponentConfiguration.class);
    app.listeners(bootstrapContext.commandLineListener());
    return app;
}

由于构建器类具有侦听器方法,该方法用于添加所有要注册的侦听器。 SpringApplicationBuilder的Github链接是http://goo.gl/EGj6jE

我认为这将解决您的问题。

斯瓦拉杰

答案 2 :(得分:0)

来自SpringBootServletInitializer javadoc:一个方便的自以为是的WebApplicationInitializer,用于只有一个Spring servlet的应用程序,并且只有一个过滤器(它本身仅在检测到Spring Security时启用)。如果您的应用程序更复杂,请考虑使用其他WebApplicationInitializers

因此,如果您想要生成战争,并且想要包含会话侦听器,则应直接使用WebApplicationInitializer。以下是javadoc中的一个示例:

public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
      // Create the 'root' Spring application context
      AnnotationConfigWebApplicationContext rootContext =
        new AnnotationConfigWebApplicationContext();
      rootContext.register(AppConfig.class);

      // Manage the lifecycle of the root application context
      container.addListener(new ContextLoaderListener(rootContext));

      // Create the dispatcher servlet's Spring application context
      AnnotationConfigWebApplicationContext dispatcherContext =
        new AnnotationConfigWebApplicationContext();
      dispatcherContext.register(DispatcherConfig.class);

      // Register and map the dispatcher servlet
      ServletRegistration.Dynamic dispatcher =
        container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/");
    }

}

由于您在ServletContext完全初始化之前可以完全控制它,因此很容易添加您的监听器:

    container.addListener(YourListener.class);

答案 3 :(得分:0)

只是提供官方文档的参考, http://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/#httpsession-rest

如果您参考HttpSessionListener主题,则会在JavaXML配置方式中找到明确的示例。

如果您的配置支持Redis

@Configuration
@EnableRedisHttpSession
public class RedisHttpSessionConfig {

    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
            return new HttpSessionEventPublisher();
    }

    // ...
}

在XML配置中,这可能看起来像

<bean class="org.springframework.security.web.session.HttpSessionEventPublisher"/>

答案 4 :(得分:0)

或者你可以使用 HttpSessionEventPublisher:

@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
    return new HttpSessionEventPublisher();
}

像这样的描述:https://www.baeldung.com/spring-security-session