Shiro已过期会话处理



我的独立应用程序使用Shiro进行安全管理。我遇到会话过期的问题。如果用户会话过期,并且当我尝试将用户重新登录时,我会得到以下异常。有人能帮忙吗?

org.apache.shiro.session.UnknownSessionException:没有id为[d32af383-5f26-463f-a2f0-58a0e82c7890]的会话网址:org.apache.shiro.session.mgt.eis.AbstractSessionDAO.readSession(AbstractSessionDAO.java:170)网址:org.apache.siro.session.mgt.DefaultSessionManager.recovereSessionFromDataSource(DefaultSessionManager.java:236)网址:org.apache.shiro.session.mgt.DefaultSessionManager.recovereSession(DefaultSessionManager.java:222)网址:org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSession Manager.java:118)网址:org.apache.shiro.session.mgt.AbstractNativeSessionManager.lolookupSession(AbstractNativeSession Manager.java:105)网址:org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupRequiredSession(AbstractNativeSession Manager.java:109)网址:org.apache.shiro.seession.mgt.AbstractNativeSessionManager.stop(AbstractNativeSession Manager.java:238)网址:org.apache.shiro.session.mgt.DelegatingSession.stop(DelegatingSession.java:127)网址:org.apache.shiro.session.ProxiedSession.stop(ProxiedSession.java:107)网址:org.apache.shiro.subject.support.DelegatingSubject$StopingAwareProxiedSession.stop(DelegatingSubject.java:419)网址:org.apache.shiro.session.ProxiedSession.stop(ProxiedSession.java:107)在org.apache.shiro.subject.support.DelegatingSubject$StopingAwareProxiedSession.stop(DelegatingSubject.java:419)

我正在使用spring配置shiro

<bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager"> 
<property name="realm" ref="myRealm"/>
<property name="sessionManager.globalSessionTimeout" value="3600000" />
</bean> 
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> 
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  
<property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> 
<property name="arguments" ref="securityManager"/> 
</bean> 

在使用远程ejb进行身份验证时,我也面临同样的问题。

作为一种变通方法,第一次登录尝试是在try/catch块中捕获UnknownSessionException。然后从头开始构建Subject,用于再次登录用户。

UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
} catch (UnknownSessionException use) {
subject = new Subject.Builder().buildSubject();
subject.login(token);
session = subject.getSession(true);
}

最新更新