<!-- 5 配置緩存管理器 --> <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"></property> </bean> <!-- 2 配置安全管理器 securityManager--> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="customRealm"></property> <!-- 注入緩存管理器 --> <property name="cacheManager" ref="cacheManager"></property> </bean>
shiro-ehcache.xml文件web
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="h:\ehcache"/> <!-- name:緩存名稱。 maxElementsInMemory:緩存最大個數。 eternal:對象是否永久有效,一但設置了,timeout將不起做用。 timeToIdleSeconds:設置對象在失效前的容許閒置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,可選屬性,默認值是0,也就是可閒置時間無窮大。 timeToLiveSeconds:設置對象在失效前容許存活時間(單位:秒)。最大時間介於建立時間和失效時間之間。僅當eternal=false對象不是永久有效時使用,默認是0.,也就是對象存活時間無窮大。 overflowToDisk:當內存中對象數量達到maxElementsInMemory時,Ehcache將會對象寫到磁盤中。 diskSpoolBufferSizeMB:這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。每一個Cache都應該有本身的一個緩衝區。 maxElementsOnDisk:硬盤最大緩存個數。 diskPersistent:是否緩存虛擬機重啓期數據 Whether the disk store persists between restarts of the Virtual Machine. The default value is false. diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。 memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。默認策略是LRU(最近最少使用)。你能夠設置爲FIFO(先進先出)或是LFU(較少使用)。 clearOnFlush:內存數量最大時是否清除。 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> </ehcache>
/** * 清空緩存(通常在修改權限的service中調用) */ public void clearCached(){ PrincipalCollection principals=SecurityUtils.getSubject().getPrincipals(); super.clearCache(principals); }
清空緩存測試 (這是模擬測試 在controller中進行):spring
package com.shi.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.shi.shiro.CustomRealm; @Controller public class CleanCacheTest { @Autowired private CustomRealm customRealm; @RequestMapping("/cleanCache.action") public String cleanCache()throws Exception{ customRealm.clearCached(); System.out.println("清空緩存..."); return "refuse"; } }
applicationContext-shiro.xml配置文件:apache
<!-- 6 sessionManager 會話管理器--> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <!-- session的失效時間,單位毫秒 --> <property name="globalSessionTimeout" value="60000"/> <!-- 刪除失效的session --> <property name="deleteInvalidSessions" value="true"/> </bean>
<!-- 2 配置安全管理器 securityManager--> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="customRealm"></property> <!-- 注入緩存管理器 --> <property name="cacheManager" ref="cacheManager"></property> <!-- 配置session管理器(SessionManager) --> <property name="sessionManager" ref="sessionManager"></property> </bean>