SecurityManager是shiro的核心,负责与shiro的其他组件进行交互;SessionManager是session的真正管理者,负责shiro的session管理;
SessionsSecurityManager的start方法中将session的创建委托给了具体的sessionManager,是创建session的关键入口。
SimpleSession是shiro完完全全的自己实现,是shiro对session的一种拓展;实现了ValidatingSession接口,具有自我校验的功能;一般不对外暴露,暴露的往往是他的代理:DelegatingSession;SimpleSession有几个属性值得重点关注下,如下
id:就是session id;
startTimestamp:session的创建时间;
stopTimestamp:session的失效时间;
lastAccessTime:session的最近一次访问时间,初始值是startTimestamp
timeout:session的有效时长,默认30分钟
expired:session是否到期
attributes:session的属性容器
查询
session的创建完成后,会将session(SimpleSession类型)对象的代理对象(DelegatingSession)装饰成StoppingAwareProxiedSession对象,然后绑定到subject(类型是DelegatingSubject);
Session session = subject.getSession();返回的就是绑定在当前subjuct的session。注意subject的实际类型是:DelegatingSubject,如下图
回到顶部
刷新
shiro的Session接口提供了一个touch方法,负责session的刷新;session的代理对象最终会调用SimpleSession的touch():
public void touch() {
this.lastAccessTime = new Date(); // 更新最后被访问时间为当前时间
}
但是touch方法是什么时候被调用的呢?JavaSE需要我们自己定期的调用session的touch() 去更新最后访问时间;如果是Web应用,每次进入ShiroFilter都会自动调用session.touch()来更新最后访问时间,ShiroFilter的类图如下:
作者:java菜
链接:https://www.jianshu.com/p/54762fef5d58