首先,我们打开[Spring Security+Spring Data Jpa 强强联手,安全管理只有更简单!](()一文中的案例,这个案例结合 Spring Data Jpa 将用户数据存储到数据库中去了。
然后我们将上篇文章中涉及到的登录页面拷贝到项目中(文末可以下载完整案例):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7XB0viq6-1588898082940)(http://img.itboyhub.com/2020/04/20200506204420.png)]
并在 SecurityConfig 中对登录页面稍作配置:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(“/js/", "/css/”, “/images/**”);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
…
.and()
.formLogin()
.loginPage(“/login.html”)
.loginProcessingUrl(“/doLogin”)
…
.and()
.sessionManagement()
.maximumSessions(1);
}
这里都是常规配置,我就不再多说。注意最后面我们将 session 数量设置为 1。
好了,配置完成后,我们启动项目,并行性多端登录测试。
打开多个浏览器,分别进行多端登录测试,我们惊讶的发现,每个浏览器都能登录成功,每次登录成功也不会踢掉已经登录的用户!
这是怎么回事?
[](()2.问题分析
要搞清楚这个问题,我们就要先搞明白 Spring Security 是怎么保存用户对象和 session 的。
Spring Security 中通过 SessionRegistryImpl 类来实现对会话信息的统一管理,我们来看下这个类的源码(部分):
pu 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信