shiro 无状态应用报DisabledSessionException?

萝らか妹 提交于 2021-01-14 12:57:39

无状态的web应用在执行到getSubject(request, response).login(statelessToken)时,报以下异常:
[org.apache.shiro.subject.support.DisabledSessionException: Session creation has been disabled for the current subject.

部分相关代码如下:
已经禁止创建session:

 

public class StatelessWebSubjectFactory extends DefaultWebSubjectFactory {
    public Subject createSubject(SubjectContext context) {
        // 不创建 session,如果之后调用 Subject.getSession()将抛出 DisabledSessionException 异常
        context.setSessionCreationEnabled(false);
        return super.createSubject(context);
    }
}

 

 

在程序执行到以下代码时,出现异常:

StatelessToken statelessToken = new StatelessToken(user.getEmployeeNo());
getSubject(request, response).login(statelessToken);

异常为:
[org.apache.shiro.subject.support.DisabledSessionException: Session creation has been disabled for the current subject.

 

  • 问题分析:

这个是因为shiro 会默认调用getseesion 方法,而我们上面关闭了创建session ,这边自然就获取不到。这是就会报错

 

  • 找到了问题,那就解决问题:

关闭 ShiroDAO 功能

不需要将 Shiro Session 中的东西存到任何地方(包括 Http Session 中)

禁止Subject的getSession方法

 

 

  • springmvc  的配置:

 shiro配置文件,applicationContext-shiro.xml



    <bean  id ="defaultSessionStorageEvaluator" class="org.apache.shiro.mgt.DefaultSessionStorageEvaluator">
        <property name="sessionStorageEnabled" value="false"></property>
    </bean>
    <bean  id ="subjectDAO" class="org.apache.shiro.mgt.DefaultSubjectDAO">
        <property name="sessionStorageEvaluator" ref="defaultSessionStorageEvaluator"/>
    </bean>



    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!-- 配置 realm -->
        <property name="realm" ref="bosRealm"/>
        <property name="subjectDAO" ref="subjectDAO"/>

    </bean>

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!