Shiro在线会话管理
参考文章:
实现效果预览:
Shiro提供一个对象org.apache.shiro.session.mgt.eis.SessionDAO
,通过此对象可以获取到Shiro的Session中有效的Session对象,通过此对象,我们可以获取到用户登录的数据,比如:用户名、密码、ID、SessionID、登录时间、最后访问时间、IP地址等等。
下面我们实现两个功能:
获取在线会话列表
实现强制下线功能
准备
ShiroConfig
这里我使用的是Redis来储存Shiro的Session信息,修改SessionDAO
配置:
1 |
|
还需要将SessionDAO
注入到SessionManager
中:
1 |
|
最后将SessionManager
注入到SecurityManager
中:
1 |
|
获取在线会话列表
OnlineUser.java
1 |
|
Service
编写获取在线会话列表的service层实现:
1 |
|
getActiveSessions()
将获取到所有有效的Session集合,通过DefaultSubjectContext.PRINCIPALS_SESSION_KEY
可以判断当前系统Subject
中的session key
和sessions
列表中的session是否匹配,不匹配则session无效。
session.getHost()
顾名思义就是获取Host主机地址即IP地址。
AddressUtil.getAddress(session.getHost())
是通过IP地址查询其详细的地理位置,使用了ip2region
开源库。
根据IP查询地址位置
开源地址:https://github.com/lionsoul2014/ip2region
引入ip2region
的依赖:
1 | <dependency> |
拷贝ip2region.db
文件(开源仓库中找)到项目的resources/config/
下
参考官方实例代码写工具类AddressUtil.java
1 | public class AddressUtil { |
结
当前端请求/online/list
接口时,将List<OnlineUser>
结合数据返回给前端渲染即可。
实现强制下线功能
controller
1 | "/forceLogout") ( |
注意这个id
是sessionID
service实现
1 |
|
交流
QQGroup:671017003
WeChatGroup: 关注公众号查看