目录
3.2 applicationContext-shiro.xml配置
5.5、开启Shiro的授权或者认证数据缓存 在自定义Realm配置中开启并设置授权或者认证数据缓存
一、会话管理
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过期支持,对Web的透明支持,SSO单点登录的支持等特性。
所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。
利用俩个组件:sessionListener会话监听器和sessionManger会话管理器实现Shiro会话管理
1、sessionManger会话管理器
会话管理器管理着应用中所有 Subject 的会话的创建、维护、删除、失效、验证等工作。是Shiro 的核心组件,顶层组件SecurityManager直接继承了SessionManager,且提供了SessionsSecurityManager实现直接把会话管理委托给相应的SessionManager
1)DefaultSessionManager:使用的默认实现,用于JavaSE环境
2)ServletContainerSessionManager:使用的默认实现,用于Web环境,其直接使用Servlet容器的会话
3)DefaultWebSessionManager:用于Web环境的实现,可以替代ServletContainerSessionManager,自己维护着会话,直接废弃了Servlet容器的会话管理
以及在配置文件中sessionManger里所包含的属性
2、SessionListener会话监听器
SessionListener会话监听器用于监听会话创建、过期及停止事件。
实现方式:
1)实现SessionListener,必须实现所有方法
2)继承SessionListenerAdapter,重写指定方法
相关API:
1)onStart(Session session):监听会话创建事件
2)onStop(Session session):监听会话销毁事件
3)onExpiration(Session session):监听会话过期事件
3、案例
步骤:
3.1、自定义一个监听器类并实现SessionListener接口
3.2、在Spring与shiro的整合配置文件中配置相关文件
3.1 监听器
package com.zjy.shiro;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.SessionListener;
/**
* @author zjy
* @site Bi8boYin
* @company xxx公司
* @create 2022-08-27 11:34
*/
public class ShiroSessionListener implements SessionListener {
@Override
public void onStart(Session session) {
System.out.println("ShiroSessionListener.onstart..."+session.getId());
}
@Override
public void onStop(Session session) {
System.out.println("ShiroSessionListener.onStop..."+session.getId());
}
@Override
public void onExpiration(Session session) {
System.out.println("ShiroSessionListener.onExpiration..."+session.getId());
}
}
3.2 applicationContext-shiro.xml配置
<!--注册安全管理器-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="shiroRealm" />
<property name="sessionManager" ref="sessionManager"></property>
</bean>
<!-- Session ID 生成器 -->
<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator">
</bean>
<!--sessionDao自定义会话管理,针对Session会话进行CRUD操作-->
<bean id="customSessionDao" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO">
<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>
<!--会话监听器-->
<bean id="shiroSessionListener" class="com.zjy.shiro.ShiroSessionListener"/>
<!--会话cookie模板-->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<!--设置cookie的name-->
<constructor-arg value="shiro.session"/>
<!--设置cookie有效时间-->
<property name="maxAge" value="-1"/>
<!--设置httpOnly-->
<property name="httpOnly" value="true"/>
</bean>
<!--SessionManager会话管理器-->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!--设置session会话过期时间 毫秒 2分钟=120000-->
<propert