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;
}
只有这么写是可以的,具体参考这里