Shiro整合EhCache緩存(九)

勿以惡小而爲之,勿以善小而不爲--------------------------劉備

勸諸君,多行善事積福報,莫作惡

上一章簡單介紹了 SSM整合Shiro實現RBAC(八),如果沒有看過,請觀看上一章

本章節是在上一章節的基礎上進行優化的,所以一定要先讀上一章節的內容。

一. 爲什麼要使用緩存?

在上一章節的時候,每次我們刷新頁面,或者每次進行權限驗證時,都需要進行查詢該用戶的所有的權限數據, 花費了大量的時間,查詢相同的數據。 所以,我們需要緩存。 如果我們想查詢的數據,在緩存裏面,就直接從緩存裏面拿 ,如果緩存中不存在想查詢的數據,那麼才從數據庫中查詢。 注意,當授權信息發生改變時,需要清理緩存,不然會一直使用原先的舊權限數據。

關於數據庫緩存, 可以使用 redis ,也可以使用 ehcache,現在主流使用 redis 非關係型數據庫。

與shiro 整合,我們建議還是使用原先的 ehcache 緩存。

二. Shiro 整合 EhCache 緩存

二.一 pom.xml 中添加依賴

<!-- 添加緩存 -->
<dependency>
	<groupId>net.sf.ehcache</groupId>
	<artifactId>ehcache</artifactId>
	<version>2.10.4</version>
</dependency>

二.二 添加ehcache 配置文件 到根路徑下

ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />
</ehcache>

二.三 在 applicationContext-shiro.xml 配置文件中配置緩存

二.三.一 配置緩存 EhCacheManager ,指定緩存文件

<!-- 配置ehcache 緩存 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
	<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"></property>
</bean>

二.三.二 將 cacheManager 注入到 securityManager 裏面


<!-- 配置securityManager, 將一些信息注入到裏面 -->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
	<!-- 注入自定義realm -->
	<property name="realm" ref="myRealm"></property>
	<!-- 注入緩存管理 -->
	<property name="cacheManager" ref="cacheManager"></property>
</bean>

只需要這簡單的三步,就可以了。 MyRealm 代碼不用任何改變。

二.四 測試 Ehcache 緩存

輸入網址: http://localhost:8080/SSM_Shiro_Cache/User/toLogin

填寫 admin ,密碼 1234

有圖片

有圖片

注意,查看控制檯,最主要的是控制檯信息。

有圖片

發現,只打印了一條 獲取權限 的輸出語句, 不像以前那樣,打印出5,六條數據。

多次刷新部門表,

有圖片

發現,仍然沒有二次查詢。

輸入網址: http://localhost:8080/SSM_Shiro_Cache/Dept/add,http://localhost:8080/SSM_Shiro_Cache/Dept/delete 利用註解權限驗證, 發現,仍然只打印一條,依舊是從緩存中取出來的數據。
在這裏插入圖片描述

Shiro 整合EhCache 緩存成功。

然而,如何去清理緩存呢?

三. Shiro 清理緩存

三.一 AuthorizingRealm

MyRealm 繼承了 AuthorizingRealm 抽象類, 該 類 繼承了 CachingRealm 類,


可以在 MyRealm 中定義一個方法, 去調用 子類中的清理緩存的方法,來達到 清理緩存的目的。

三.二 MyRealm 中定義一個清理緩存的方法

/**
 * 清除緩存
 */
public void clearCache() {
	System.out.println("清除緩存數據");
	Subject subject=SecurityUtils.getSubject();
	// 調用子類去清理緩存
	super.clearCache(subject.getPrincipals());
}

三.三 注入 MyRealm 對象, 調用clearCache 方法

由於 我們已經通過 Spring 來管理 MyRealm 對象了, 所以可以將 MyRealm 對象注入到我們創建的類裏面。

當權限發生改變時,調用即可。

如,我們放置到 PrivilegeAction 中


@Autowired
private MyRealm myRealm;


@RequestMapping("/clearCache")
	@ResponseBody
	public Map<String,Object> clearCache(){
		Map<String,Object> map=new HashMap<String,Object>();
		myRealm.clearCache();
		map.put("response_status", true);
		return map;
	}

當我們 通過 /Privilege/clearCache 訪問時,就可以清理緩存了。

三.四 驗證清理緩存

當輸入 admin 登錄之後, 多次刷新 dept頁面,仍然使用的是緩存。

這個時候,我們輸入網址: http://localhost:8080/SSM_Shiro_Cache/Privilege/clearCache

來進行清理緩存

有圖片

有圖片

這個時候,我們再跳轉到 主頁, /Main/toMain

有圖片

會重新去獲取一次緩存。

再次多次刷新 dept頁面, 從緩存中取數據

有圖片

清理緩存,是成功的。

本章節代碼鏈接爲:

鏈接:https://pan.baidu.com/s/1-t84HDcV8cCf59hBtd2AjA 
提取碼:dust

謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章