1. 程式人生 > >Shiro學習筆記(6)——shiro快取

Shiro學習筆記(6)——shiro快取

快取

每一次給使用者授權時,都是通過realm從資料庫中查詢許可權,為了避免頻繁的查詢資料庫,shiro給我們提供了快取的能力

使用者認證通過後:
第一次授權:通過realm從資料庫中查詢
第二次授權:直接從快取中查詢

引入包
1. shiro-ehcache.jar
2. ehcache-core.jar

配置快取

建立快取檔案

在src下建立shiro-ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation
="../config/ehcache.xsd">
<!--diskStore:快取資料持久化的目錄 地址 --> <diskStore path="F:\develop\ehcache" /> <defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000" eternal="false" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds
="120" timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
</defaultCache> </ehcache>

配置快取管理器

<!-- securityManager安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"
>
<property name="realm" ref="userRealm" /> <!-- 注入快取管理器 --> <property name="cacheManager" ref="cacheManager"/> </bean> <!-- 快取管理器 --> <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"/> </bean>

清除快取

一般情況下,使用者正常退出和非正常退出(如關閉瀏覽器)都會自動清空快取,但是有時候我們需要手動清空快取。
例如:修改了一個使用者的許可權,需要手動清空快取,否則這個使用者只要不退出,許可權就一直不改變。

手動情況快取需要在realm中定義一個方法,然後在其他程式碼中呼叫它

在reaml中定義:

//清除快取
    public void clearCached() {
        PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();
        super.clearCache(principals);
    }

在其他程式碼中呼叫:先注入reaml,在執行clearCached方法

@autowire 
private UserRealm userRealm;

userRealm.clearCached();