无状态的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>
来源:oschina
链接:https://my.oschina.net/u/4598896/blog/4898556