2021SC@SDUSC
SessionsSecurityManager类继承关系图:
Shiro 支持SecurityManager类层次结构,它将所有session操作委托给一个包装SessionManager实例。 也就是说,这个类实现了SessionManager接口中的方法,但实际上,这些方法只是对底层“真实” SessionManager实例的传递调用。
此类或其父类未实现的其余SecurityManager方法由子类实现。
为了与此层次结构中的其他类保持一致,以及 Shiro 尽可能减少配置的愿望,将在实例化时为所有依赖项创建合适的默认实例。
私有变量
private SessionManager sessionManager;
此安全管理SessionManager使用的内部委托SessionManager管理所有应用程序的Session
方法分析
setSessionManager
public void setSessionManager(SessionManager sessionManager) {
this.sessionManager = sessionManager;
afterSessionManagerSet();
}
设置将用于支持此实现的SessionManager方法调用的底层委托SessionManager实例。
此SecurityManager实现不提供支持继承的SessionManager接口的逻辑,而是将这些调用委托给内部SessionManager实例。
如果未设置SessionManager实例,则会为现有运行时环境自动创建和初始化默认实例
getSessionManager
public SessionManager getSessionManager() {
return this.sessionManager;
}
返回此安全管理器的内部委托SessionManager
afterCacheManagerSet
protected void afterCacheManagerSet() {
super.afterCacheManagerSet();
applyCacheManagerToSessionManager();
}
调用super.afterCacheManagerSet()然后立即调用applyCacheManagerToSessionManager()以确保根据需要将CacheManager应用于 SessionManager。
afterEventBusSet
protected void afterEventBusSet() {
super.afterEventBusSet();
applyEventBusToSessionManager();
}
如有必要,在 SessionManager 上设置任何已配置的 EventBus
applyCacheManagerToSessionManager
protected void applyCacheManagerToSessionManager() {
if (this.sessionManager instanceof CacheManagerAware) {
((CacheManagerAware) this.sessionManager).setCacheManager(getCacheManager());
}
}
确保内部委托SessionManager被注入新设置的CacheManager以便它可以将其用于其内部缓存需求。
注意:如果 SessionManager 实例实现了CacheManagerAware接口,则此实现仅将 CacheManager 注入到 SessionManager 中
applyEventBusToSessionManager
protected void applyEventBusToSessionManager() {
EventBus eventBus = getEventBus();
if (eventBus != null && this.sessionManager instanceof EventBusAware) {
((EventBusAware)this.sessionManager).setEventBus(eventBus);
}
}
确保内部委托SessionManager注入了新设置的EventBus以便它可以将其用于其内部事件需求。
注意:如果 SessionManager 实例实现了EventBusAware接口,则此实现仅将 EventBus 注入 SessionManager
start
public Session start(SessionContext context) throws AuthorizationException {
return this.sessionManager.start(context);
}
.sessionManager开始