2017-06-07 32 views
0

我正在使用shiro進行身份驗證以及ehcache.xml以啓用SSO。shiro和ehcache問題

我ehcache.xml中看起來像

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" 
     monitoring="autodetect" dynamicConfig="true" name="my-cache"> 

    <diskStore path="java.io.tmpdir/mycache" /> 


    <cache name="shiro-activeSessionCache" maxElementsInMemory="1000" 
      eternal="true" overflowToDisk="true" memoryStoreEvictionPolicy="LFU"> 

    </cache> 

    <defaultCache maxElementsInMemory="100" eternal="true" 
        overflowToDisk="true" memoryStoreEvictionPolicy="LFU"> 
    </defaultCache> 
</ehcache> 

我有一個工廠類,像下面

public class SharedEhCacheManagerFactory implements Factory<CacheManager> { 

    private String cacheManagerConfigFile = "/ehcache.xml"; 

    @Override 
    public CacheManager getInstance() 
    { 
     return CacheManager.create(readCacheManagerConfigFileAsInputStream()); 
    } 

    public InputStream readCacheManagerConfigFileAsInputStream() 
    { 
     InputStream is = getClass().getResourceAsStream(cacheManagerConfigFile); 
     return is; 
    } 
} 

而且我shiro.ini文件所有web應用的主要部分是像

[main] 
ehCacheManager = com.nokia.anv.app.security.service.SharedEhCacheManagerFactory 
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager 
cacheManager.cacheManager=$ehCacheManager 
securityManager.cacheManager = $cacheManager 

sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO 
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager 
sessionManager.sessionDAO = $sessionDAO 

cookie = org.apache.shiro.web.servlet.SimpleCookie 
cookie.name = SSOCookie 
cookie.path =/
sessionManager.sessionIdCookie = $cookie 
sessionManager.sessionIdUrlRewritingEnabled = false 
securityManager.sessionManager = $sessionManager 

我正在使用apache karaf,並且這個應用程序在docker容器中。當我開始在容器的第一次一切都很好,但如果我停止和啓動容器我正在錯誤的大部分appllications像

javax.servlet.ServletException: java.lang.IllegalStateException: The CacheManager has been shut down. It can no longer be used. 
     at org.apache.shiro.web.servlet.AdviceFilter.cleanup(AdviceFilter.java:196) 
     at org.apache.shiro.web.filter.authc.AuthenticatingFilter.cleanup(AuthenticatingFilter.java:155) 
     at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:148) 
     at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 
     at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) 
     at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) 
     at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) 

但總是兩個應用都是精品。請讓我問題是什麼。

回答

1

我在猜你正在調用CacheManager中的destroy()方法。你可以添加一些日誌記錄或設置一個斷點來確定罪魁禍首。