美文网首页
Shiro 中的 SessionStorageEvaluator

Shiro 中的 SessionStorageEvaluator

作者: JSON_NULL | 来源:发表于2019-02-14 09:46 被阅读1次

    DefaultSubjectDAO中有一个SessionStorageEvaluator类型的属性sessionStorageEvaluator;它是用于判断 Subject 是否可以使用 Session 来保存其内部状态的。SessionStorageEvaluator有两个实现DefaultSessionStorageEvaluatorDefaultWebSessionStorageEvaluator。并且DefaultWebSessionStorageEvaluator继承自DefaultSessionStorageEvaluator

    使用SubjectSession来持久保存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中。

    1. 此方法返回 true 时表示 Subject 可以存储到Session
    2. 此方法返回 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 过滤器中的特定设置进行了扩展判断。具体如下:

    1. 如果NoSessionCreationFilter 在过滤器链中配置,则该过滤器将设置一个特定的 ServletRequest 属性指示禁用会话创建。
    2. DefaultWebSessionStorageEvaluator将检查此属性,如果已设置,isSessionStorageEnabled方法返回false ,从而阻止Shiro创建Session以存储Subject状态。
    3. 如果尚未设置请求属性(即NoSessionCreationFilter未配置或已禁用),则此类不执行任何操作,所有行为与其父类相同。

    相关文章

      网友评论

          本文标题:Shiro 中的 SessionStorageEvaluator

          本文链接:https://www.haomeiwen.com/subject/hqyseqtx.html