shiro session 创建与存储(配有源码解析)

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 的类图如下
shiro session 创建与存储(配有源码解析)
文章图片

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的类图如下:
shiro session 创建与存储(配有源码解析)
文章图片

分析了DefaultWebSecurityManager和在其中委托session管理的sessionManager,那么session 创建是何时开始的呢?看下面代码:
shiro session 创建与存储(配有源码解析)
文章图片

红色边框出现的地方是session 创建的地方。
shiro session 创建与存储(配有源码解析)
文章图片

由上图开始。接下来是sessing 创建以及存储的时序图
shiro session 创建与存储(配有源码解析)
文章图片

由上图可知,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定义。以及轮询时间。








    推荐阅读