最开始参考网上的方法,配置了eternal="false",也设置了timeToIdleSeconds和timeToLiveSeconds的值,但是一直没有没有生效,没到半小时就自动登录失效了。原来的配置如下:
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="7200"
timeToLiveSeconds="86400"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"/>
<!-- 授权缓存 -->
<cache name="authorizationCache"
maxEntriesLocalHeap="2000"
eternal="false"
timeToIdleSeconds="7200"
timeToLiveSeconds="86400"
overflowToDisk="false"
statistics="true"/>
<!-- 认证缓存 -->
<cache name="authenticationCache"
maxEntriesLocalHeap="2000"
eternal="false"
timeToIdleSeconds="7200"
timeToLiveSeconds="86400"
overflowToDisk="false"
statistics="true"/>
再看了很多博客后,发现用力错地方~ 并且,解决办法及其简单。。。。
解决办法:
第一步、修改ShiroConfiguration,增加DefaultWebSessionManager()。
增加DefaultWebSessionManager,调用setGlobalSessionTimeout方法,设置全局Session过期时间,单位为毫秒。
话不多说,贴代码:
@Bean
public DefaultWebSessionManager getDefaultWebSessionManager() {
DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
defaultWebSessionManager.setGlobalSessionTimeout(1000 * 60 * 24);// 会话过期时间
defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
defaultWebSessionManager.setSessionIdCookieEnabled(true);
return defaultWebSessionManager;
}
第二步、修改ShiroConfiguration,修改DefaultWebSecurityManager()。
修改DefaultWebSecurityManager,调用setSessionManager方法,注入Session管理器。
@Bean(name = "securityManager")
public DefaultWebSecurityManager defaultWebSecurityManager(MyShiroRealm myShiroRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//设置realm.
securityManager.setRealm(myShiroRealm);
//注入缓存管理器;
securityManager.setCacheManager(ehCacheManager());
//注入Session管理器;
securityManager.setSessionManager(getDefaultWebSessionManager());
return securityManager;
}
重启你的项目,就发现万事大吉了。
未设置DefaultWebSessionManager半小时失效的原因如下:
如果我们没有人工注入Session管理器,DefaultWebSecurityManager会注入默认的ServletContainerSessionManager,ServletContainerSessionManager实现了WebSessionManager接口,WebSessionManager继承自SessionManager,SessionManager的抽象实现类AbstractSessionManager设置了默认Session超时时间为半小时。
关键代码和继承实现关系如下面三个图所示,我就不多BB了,自己看吧。

结构图

DefaultWebSecurityManager

AbstractSessionManager