小组Java

一、开发需求:

1.为一个web系统添加sesssion的会话管理,限制一个账号在同一时间只能被同一人登录。
2.登录的账号在规定的时间内没有发送请求将会会话超时(session timeout)。
3.账号已被登录的情况下被异地登录,原登录地将会被踢出账号登录。

二、技术分析:

1.项目本身使用spring boot框架实现,并集成了spring security和spring session,
采用cas单点登录认证,前后端分离实现的web项目。
2.该需求是采用spring security实现的,那么首先分析一下spring security怎么去实
现这一功能,根据官方文档介绍,这是在spring security里面专门的一个模块session
management里面实现的。
3.实现的基本原理讲解,首先由定义session监听器监听会话登录事件,再讲该session事件
交由spring security来处理,spring security本身提供了对这一事件处理的支持,包括
很多定义好的session策略来处理监听好的session事件。

三、具体实现:

1.定义session监听器,很多网上文章尝试直接用bean的方式注入,该方式定义有两种,都是
在SecurityConfig配置类中注册(该类是继承了WebSecurityConfigurerAdapter类的):

还有一种注册是

但是我们注意观察spring security的源码就会发现,其实还有一个类就是AbstractSecurityWebApplicationInitializer类
里面的源码有一段

官方的源码里面这个关于HttpSessionEventPublisher里面的设置是禁用的,所以我们在启用HttpSessionEventPublisher
时需要重写这个类的配置

然后就是在SecurityConfig类中

在这里SessionRegistry是由SessionRegistryImpl具体实现,我们来看看SessionRegistryImpl的源码

我们发现被ApplicationListener监听到的事件都是交由SessionRegistryImpl来处理的,而在HttpSessionEventPublisher里面
有这样的声明

也说明了HttpSessionEventPublisher也是监听ApplicationContext上下文事件的,也就是说HttpSessionEventPublisher
会将SessionRegistryImpl处理。然后定义配置块:

当然也可以这么写

由于给出部分代码,并浅析了一些原理,在具体的代码调试中还有些问题需要去解决,欢迎一起讨论。

2 收藏


直接登录
最新评论
  • 您好,我现在跟您有同样的需求,但是根据您的配置,没有实现该功能,能加您qq交流一下么