前言
Shiro 提供了完整的会话管理功能,可以在不依赖底层容器,不仅可以在 WEB 环境下使用 Session,还可以在 JavaSE 环境下使用,且提供了会话管理,会话事件监听,会话持久化,过期支持。
会话操作
所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。
获取 Session 方法:
1 | Subject subject = SecurityUtils.getSubject(); |
Session 常用方法:
1 | session.getId(); // 会话 ID, 唯一标识 |
会话管理器
会话管理器管理应用中所有 Subject 的会话的创建、维护、删除、失效、验证等工作。
Shiro提供了三个默认实现:
DefaultSessionManager:DefaultSecurityManager 使用的默认实现,用于JavaSE环境;
ServletContainerSessionManager:DefaultWebSecurityManager使用的默认实现,用于Web环境,其直接使用Servlet容器的会话;
DefaultWebSessionManager:用于Web环境的实现,可以替代ServletContainerSessionManager,自己维护着会话,直接废弃了Servlet容器的会话管理。
会话监听器
会话监听器用于监听会话创建、过期及停止事件:
1 | package im.zhaojun.session.listener; |
当然,如果你只想监听某个事件,可以继承自 SessionListenerAdapter
:
1 | package im.zhaojun.session.listener; |
然后将会话监听器配置到 sessionManager
中,在将 sessionManager
配置到 securityManager
:
1 | <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> |
会话持久化/存储
Shiro 提供 SessionDAO 用于会话的 CRUD,我们可以用它来从 Redis 中增删改查 Session 信息,只需要继承自 SessionDAO
:
1 | package im.zhaojun.session; |
这里和上一章,授权数据的缓存很相像,那里是对授权数据的增删改查,这里是对 Session 数据的增删改查。
然后将其配置到 sessionManager
中:
1 | <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> |
小结
我们可以使用 Shiro 提供的这一系列操作会话的工具来完成很多功能,如单点登陆,单设备登陆,踢出用户,获取所有登陆用户等信息。
本章代码地址 : https://github.com/zhaojun1998/Premission-Study/tree/master/Permission-Shiro-09/