目录
一、Shiro会话管理
1.1 分析tomcat会话管理与Shiro会话管理的区别
tomcat:用户第一次发送登录请求 ---> tomcat【将用户登录信息存入session】
用户第二次发送功能请求 ---> 验证tomcat的session中是否存在用户的登录信息;
Shiro会话管理:用户第一次发送登录请求 ---> 对应多个tomcat
问题:会存在访问不到用户信息的tomcat的情况;
解决方法:【将用户登录信息存在tomcat的一个共有的位置ehcache中】
用户第二次发送功能请求 ---> 验证ehcache缓存中是否存在用户登录信息;
画图理解:
结论:
Shiro的会话管理具备tomcat的会话管理的一切功能,
同时相较于tomcat的session,Shiro提供了对于分布式session的管理;
以上就是我们为什么要学习Shiro会话管理的原因;
1.2 Shiro会话管理的使用
1.2.1 实现SessionListener的监听器
MySessionListener
package com.leaf.ssm.shiro;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.SessionListener;
/**
* @author Leaf
* @site 2977819715
* @company 玉渊工作室
* @create 2022-08-29 9:42
*/
public class MySessionListener implements SessionListener {
@Override
public void onStart(Session session) {
//登录发请求时
System.out.println("MySessionListener.onStart 执行..."+session.getId());
}
@Override
public void onStop(Session session) {
//退出时执行
System.out.println("MySessionListener.onStop 执行..."+session.getId());
}
@Override
public void onExpiration(Session session) {
//session有效期到时
System.out.println("MySessionListener.onExpiration 执行..."+session.getId());
}
}
1.2.2 添加Spring-shiro的配置
① sessionManager
② cookie模板
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.leaf.ssm.shiro.MySessionListener"/>
<!--会话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 防止xss攻击: cookie劫持-->
<property name="httpOnly" value="true"/>
</bean>
<!--SessionManager会话管理器-->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!--设置session会话过期时间 毫秒 2分钟=120000-->
<property name="globalSessionTimeout" value="120000"/>
<!--设置sessionDao-->
<property name="sessionDAO" ref="customSessionDao"/>
<!--设置间隔多久检查一次session的有效性 默认1分钟-->
<property name="sessionValidationInterval" value="60000"/>
<!--配置会话验证调度器-->
<!--<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>-->
<!--是否开启检测,默认开启-->
<!--<property name="sessionValidationSchedulerEnabled" value="true"/>-->
<!--是否删除无效的session,默认开启-->
<property name="deleteInvalidSessions" value="true"/>
<!--配置session监听器-->
<property name="sessionListeners">
<list>
<ref bean="shiroSessionListener"/>
</list>
</property>
<!--会话Cookie模板-->