SecurityManager,安全管理器;
即所有与安全相关的操作都会与SecurityManager交互;它管理着所有Subject,所有Subject都绑定到SecurityManager,使用shiro的时候,首先都会先初始化SecurityManager,配置文件中配置的是DefaultWebSecurityManager,一直super到SessionsSecurityManager,可以看到session默认为this.sessionManager = new DefaultSessionManager();
初始化的时候 setSessionManager(new ServletContainerSessionManager());
由此可以看出默认情况下,DefaultSecurityManager会将session管理委托给DefaultSessionManager,而DefaultWebSecurityManager则将session管理委托给ServletContainerSessionManager。我们也可以指定sessionmanager.
参考https://www.cnblogs.com/youzhibing/p/9679134.html#_label2
SecurityManager 的类图如下
文章图片
spring-shiro.xml配置为:
DefaultWebSecurityManager初始化为:
【shiro session 创建与存储(配有源码解析)】 public DefaultWebSecurityManager() {
super();
((DefaultSubjectDAO) this.subjectDAO).setSessionStorageEvaluator(new DefaultWebSessionStorageEvaluator());
this.sessionMode = HTTP_SESSION_MODE;
setSubjectFactory(new DefaultWebSubjectFactory());
setRememberMeManager(new CookieRememberMeManager());
setSessionManager(new ServletContainerSessionManager());
}
如果在xml文件中没有配置sessionManager的话,用默认的ServletContainerSessionManager
通过super,可以看出sessionManager 默认为 DefaultSessionManager(),
public SessionsSecurityManager() {
super();
this.sessionManager = new DefaultSessionManager();
applyCacheManagerToSessionManager();
}
那么sessionManager的类图如下:
文章图片
分析了DefaultWebSecurityManager和在其中委托session管理的sessionManager,那么session 创建是何时开始的呢?看下面代码:
文章图片
红色边框出现的地方是session 创建的地方。
文章图片
由上图开始。接下来是sessing 创建以及存储的时序图
文章图片
由上图可知,session的最终创建在SimpleSessionFactory的createSession,返回SimpleSession(),sessionid的创建在EnterpriseCacheSessionDAO的generateSessionId方法中,并在assignSessionId方法里面存储在session中。
那什么时候将sessionid存放在cookie中呢,在AbstractNativeSessionManager的createsession,返回session后onStart()方法然后storeSessionId()将sessionID放在cookie中。
session 刷新
AbstractShiroFilter的doFilterInternal方法中updateSessionLastAccessTime(request, response);
一直跟进,则会发现在SimpleSession中的touch()犯法
public void touch() {
this.lastAccessTime = new Date();
}
session 更新
登录的时候。获取object createSubject()方法中有save()方法中mergePrincipals(),session.setAttribute()中一种跟进,在DefaultSessionManager中的onchange()方法中有update方法,时刻更新sessionId;
session的过期
AbstractNativeSessionManager 的enableSessionValidationIfNecessary判断session的过期,session的过期时间在xml定义。以及轮询时间。
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)