SpringBoot 2,HttpSessionListener注册方法

项目中需要控制并发登录,搜索了很多地方,都是讲需要配置两个地方,大概代码如下:

@Bean
public SessionRegistry sessionRegistry() {
    return new SessionRegistryImpl();
}

// 配置spring security
http.sessionManagement()
				.maximumSessions(1) // 控制并发的数量
                .maxSessionsPreventsLogin(true) // 如果并发登录,不允许后面的登录,必须等到前一个登录退出来
                .sessionRegistry(this.sessionRegistry);

问题解析

首先,按照上面配置,是不可用的,因为session的创建和销毁都没有被监听,因此,很多文章会告诉我们要配置一个HttpSessionListener,于是,我搜到很多个写法

写法1

@WebListener
public class MyListener implements HttpSessionListener {
   ...
}

这种写法有点类似写web.xml,同时还需要在程序入口加上注解@ServletComponentScan,经过测试,MyListener里面的方法不会被调用

写法2

   @Bean
    public HttpSessionListener httpSessionListener() {
        return new HttpSessionEventPublisher();
    }

stackoverflow上基本上都是这种写法,甚至spring官方文档也语焉不详的写了这么一段,测试这么做是不行的

正确写法

    @Bean
    public ServletListenerRegistrationBean<HttpSessionListener> sessionListenerWithMetrics() {
        ServletListenerRegistrationBean<HttpSessionListener> listenerRegBean = new ServletListenerRegistrationBean<>();
        listenerRegBean.setListener(new HttpSessionEventPublisher());
        return listenerRegBean;
    }

只有这么写是可以的,具体参考这里