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

Java Spring 3.5如何将HttpSessionEventPublisher添加到我的启动配置中,java,spring,spring-mvc,Java,Spring,Spring Mvc,我想听听会话生命周期事件。我读到关于添加 <listener> <listener-class> org.springframework.security.web.session.HttpSessionEventPublisher </listener-class> </listener> org.springframework.security.web.session.HttpSessionEventPublisher

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

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

org.springframework.security.web.session.HttpSessionEventPublisher

到web.xml。但我没有。我使用的类扩展了SpringBootServletilizer。如何添加此侦听器?

在扩展SpringBootSelvletInitializer的类中添加侦听器可以按如下操作

    @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链接是

我想这会解决你的问题


Swaraj

您可以使用
ServletListenerRegistrationBean

@Bean
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
    return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
}
@Bean
public ServletListenerRegistrationBean httpSessionEventPublisher(){
返回新的ServletListenerRegistrationBean(新的HttpSessionEventPublisher());
}

来自
SpringBootServletInitializer
javadoc:一个方便的、自以为是的WebApplicationInitializer,适用于只有一个Spring servlet且只包含一个筛选器的应用程序(仅当检测到Spring安全性时才启用)。如果应用程序更复杂,请考虑使用其他WebApple初始化器之一< /P> 因此,如果您希望生成war并包含会话侦听器,则应直接使用
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);

只是为了提供官方文件的参考,

在这里,如果您参考,
HttpSessionListener
主题,您将找到一个明确的示例,说明如何通过
Java
XML
配置方式来实现这一点

如果您的配置支持Redis

@Configuration
@EnableRedisHttpSession
public class RedisHttpSessionConfig {

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

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

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

或者您可以使用HttpSessionEventPublisher:

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

如以下描述所示:

我已将此代码添加到我的SpringBootServletInitializer类中。但我的问题仍然存在。当用户登录,然后注销并再次尝试登录时,会出现一个关于错误的user\pass的错误。