SpringBoot集成Shiro和EhCache,设置登录超时时间无效解决办法。

最开始参考网上的方法,配置了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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。