Shiro 中的 SessionStorageEvaluator
在DefaultSubjectDAO
中有一个SessionStorageEvaluator
类型的属性sessionStorageEvaluator
;它是用于判断 Subject
是否可以使用 Session
来保存其内部状态的。SessionStorageEvaluator
有两个实现DefaultSessionStorageEvaluator
和DefaultWebSessionStorageEvaluator
。并且DefaultWebSessionStorageEvaluator
继承自DefaultSessionStorageEvaluator
。
使用Subject
的Session
来持久保存Subject
的身份和身份验证状态(例如登录后)是一种常见的Shiro实现策略。在Session
中保存Subject
的内部信息时SessionId
会被作为唯一标识。因此,Shiro可以基于Session
重新创建Subject
实例。这样就不再需要为所有请求/调用传递身份认证信息了。
但是,在纯粹的无状态应用程序中,例如某些REST应用程序或每个请求都经过身份验证的应用程序,通常不需要或不希望使用Session
来存储此状态(因为它实际上是在每个请求上重新创建的)。在这些应用程序中,永远不会使用Session
。
此接口用于确定何时可以使用Session
存储Subject
的内部状态。
如果您只是希望在全局级别为所有Subject
启用或禁用Session
,则 DefaultSessionStorageEvaluator
应该足够了。而在Web环境中应该使用DefaultWebSessionStorageEvaluator
。
SessionStorageEvaluator
接口仅声明了这一个方法boolean isSessionStorageEnabled(Subject subject);
,用于判断Subjecrt
对象是否可以被存储到Session
中。
- 此方法返回
true
时表示Subject
可以存储到Session
中 - 此方法返回
false
时表示Subject
不可以存储到Session
中
DefaultSessionStorageEvaluator 类
在 DefaultSessionStorageEvaluator
中实现了SessionStorageEvaluator
接口中的唯一方法boolean isSessionStorageEnabled(Subject subject);
:
public boolean isSessionStorageEnabled(Subject subject) {
return (subject != null && subject.getSession(false) != null) || isSessionStorageEnabled();
}
public boolean isSessionStorageEnabled() {
return sessionStorageEnabled;
}
public void setSessionStorageEnabled(boolean sessionStorageEnabled) {
this.sessionStorageEnabled = sessionStorageEnabled;
}
由以上代码可知,我们可以通过调用public void setSessionStorageEnabled(boolean sessionStorageEnabled)
方法来设置sessionStorageEnabled
属性,从而达到控制Subject
是否被存储到Session
目的。
DefaultWebSessionStorageEvaluator 类
@Override
public boolean isSessionStorageEnabled(Subject subject) {
if (subject.getSession(false) != null) {
//use what already exists
return true;
}
if (!isSessionStorageEnabled()) {
//honor global setting:
return false;
}
//SHIRO-350: non-web subject instances can't be saved to web-only session managers:
//since 1.2.1:
if (!(subject instanceof WebSubject) && (this.sessionManager != null && !(this.sessionManager instanceof NativeSessionManager))) {
return false;
}
return WebUtils._isSessionCreationEnabled(subject);
}
DefaultWebSessionStorageEvaluator
是针对于Web环境的SessionStorageEvaluator
,它 继承DefaultSessionStorageEvaluator
并重写了 public boolean isSessionStorageEnabled(Subject subject)
方法。除执行与父类相同的逻辑外,还使用了 NoSessionCreationFilter
过滤器中的特定设置进行了扩展判断。具体如下:
- 如果
NoSessionCreationFilter
在过滤器链中配置,则该过滤器将设置一个特定的ServletRequest
属性指示禁用会话创建。 -
DefaultWebSessionStorageEvaluator
将检查此属性,如果已设置,isSessionStorageEnabled
方法返回false
,从而阻止Shiro创建Session
以存储Subject
状态。 - 如果尚未设置请求属性(即
NoSessionCreationFilter
未配置或已禁用),则此类不执行任何操作,所有行为与其父类相同。