1. 程式人生 > >Shiro - 快取管理與CacheManagerAware介面

Shiro - 快取管理與CacheManagerAware介面

【1】Realm快取

Shiro內部相應的元件(DefaultSecurityManager)會自動檢測相應的物件(如Realm)是否實現了CacheManagerAware並自動注入相應的CacheManager。

如專案啟動日誌:

[INFO][2018-11-06 15:18:18,443][org.apache.shiro.cache.ehcache.EhCacheManager]Cache with name 
'com.web.maven.shiro.CustomRealm.authorizationCache' does not yet exist.  Creating now.

[INFO][2018-11-06 15:18:18,444][org.apache.shiro.cache.ehcache.EhCacheManager]Added EhCache named 
[com.web.maven.shiro.CustomRealm.authorizationCache]

再比如專案執行時:

[INFO][2018-11-06 15:30:20,870][org.apache.shiro.session.mgt.AbstractValidatingSessionManager]Enabling session validation scheduler...

[INFO][2018-11-06 15:30:21,017][org.apache.shiro.cache.ehcache.EhCacheManager]
Using existing EHCache named [shiro-activeSessionCache]

通常在專案中我們會使用自定義的Shiro-ehcache配置檔案:

 <!-- 快取管理器 -->
 <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
     <property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"/>
 </bean>

否則,Shiro將會去載入classpath:org/apache/shiro/cache/ehcache/ehcache.xml


Shiro提供了CachingRealm,其實現了CacheManagerAware介面,提供了快取的一些基礎實現。

AuthenticatingRealm及AuthorizingRealm也分別提供了對AuthenticationInfo和AuthorizationInfo資訊的快取。

即,你所看到的Realm是有快取實現的–CacheManager。如認證過後,在登出前你無需再次認證,授權一次之後在登出前無需再次登出。都是Shiro 快取在起作用。

如授權和認證快取配置如下:

<cache name="authorizationCache"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

    <cache name="authenticationCache"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

【2】Session快取

如SecurityManager實現了SessionSecurityManager,其會判斷SessionManager是否實現了CacheManagerAware介面,如果實現了會把CacheManager設定給它。

SessionManager也會判斷相應的SessionDAO(如繼承自CachingSessionDAO)是否實現了CacheManagerAware,如果實現了會把CacheManager設定給它。

設定了快取的SessionManager,查詢時會先查快取,如果找不到才查資料庫。

如sessionDao配置:

<!-- Session DAO. 繼承 EnterpriseCacheSessionDAO -->
<bean id="sessionDAO"
	class="com.web.maven.shiro.MySessionDao">
	<property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
	<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>

DefaultSessionManager.applyCacheManagerToSessionDAO()方法原始碼如下:

private void applyCacheManagerToSessionDAO() {
    if (this.cacheManager != null && this.sessionDAO != null && this.sessionDAO instanceof CacheManagerAware) {
          ((CacheManagerAware) this.sessionDAO).setCacheManager(this.cacheManager);
      }
}

通常實際開發中,我們會使用Redis實現Shiro的快取,不再使用資料庫。

參考博文:Shiro會話管理與SessionDao