国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務(wù)器 > Web服務(wù)器 > 正文

shiro緩存機(jī)實(shí)例代碼

2024-09-01 13:52:59
字體:
供稿:網(wǎng)友

Shiro提供了類似于Spring的Cache抽象,即Shiro本身不實(shí)現(xiàn)Cache,但是對Cache進(jìn)行了又抽象,方便更換不同的底層Cache實(shí)現(xiàn)。 

Shiro提供的Cache接口: 

Java代碼  

public interface Cache<K, V> {  //根據(jù)Key獲取緩存中的值  public V get(K key) throws CacheException;  //往緩存中放入key-value,返回緩存中之前的值  public V put(K key, V value) throws CacheException;  //移除緩存中key對應(yīng)的值,返回該值  public V remove(K key) throws CacheException;  //清空整個(gè)緩存  public void clear() throws CacheException;  //返回緩存大小  public int size();  //獲取緩存中所有的key  public Set<K> keys();  //獲取緩存中所有的value  public Collection<V> values(); } 

Shiro提供的CacheManager接口: 

Java代碼 

public interface CacheManager {  //根據(jù)緩存名字獲取一個(gè)Cache  public <K, V> Cache<K, V> getCache(String name) throws CacheException; } 

Shiro還提供了CacheManagerAware用于注入CacheManager: 

Java代碼  

public interface CacheManagerAware {  //注入CacheManager  void setCacheManager(CacheManager cacheManager); } 

Shiro內(nèi)部相應(yīng)的組件(DefaultSecurityManager)會自動檢測相應(yīng)的對象(如Realm)是否實(shí)現(xiàn)了CacheManagerAware并自動注入相應(yīng)的CacheManager。  

Realm緩存

Shiro提供了CachingRealm,其實(shí)現(xiàn)了CacheManagerAware接口,提供了緩存的一些基礎(chǔ)實(shí)現(xiàn);另外AuthenticatingRealm及AuthorizingRealm分別提供了對AuthenticationInfo 和AuthorizationInfo信息的緩存。 

ini配置   

Java代碼  

userRealm=com.github.zhangkaitao.shiro.chapter11.realm.UserRealm userRealm.credentialsMatcher=$credentialsMatcher userRealm.cachingEnabled=true userRealm.authenticationCachingEnabled=true userRealm.authenticationCacheName=authenticationCacheuserRealm.authorizationCachingEnabled=true userRealm.authorizationCacheName=authorizationCache securityManager.realms=$userRealm cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager cacheManager.cacheManagerConfigFile=classpath:shiro-ehcache.xml securityManager.cacheManager=$cacheManager 

userRealm.cachingEnabled:啟用緩存,默認(rèn)false;
userRealm.authenticationCachingEnabled:啟用身份驗(yàn)證緩存,即緩存AuthenticationInfo信息,默認(rèn)false;
userRealm.authenticationCacheName:緩存AuthenticationInfo信息的緩存名稱;
userRealm. authorizationCachingEnabled:啟用授權(quán)緩存,即緩存AuthorizationInfo信息,默認(rèn)false;
userRealm. authorizationCacheName:緩存AuthorizationInfo信息的緩存名稱;

cacheManager:緩存管理器,此處使用EhCacheManager,即Ehcache實(shí)現(xiàn),需要導(dǎo)入相應(yīng)的Ehcache依賴,請參考pom.xml; 

因?yàn)闇y試用例的關(guān)系,需要將Ehcache的CacheManager改為使用VM單例模式:

this.manager = new net.sf.ehcache.CacheManager(getCacheManagerConfigFileInputStream());

改為

this.manager = net.sf.ehcache.CacheManager.create(getCacheManagerConfigFileInputStream()); 

測試用例 

Java代碼  

@Test public void testClearCachedAuthenticationInfo() {  login(u1.getUsername(), password);  userService.changePassword(u1.getId(), password + "1");   RealmSecurityManager securityManager =   (RealmSecurityManager) SecurityUtils.getSecurityManager();  UserRealm userRealm = (UserRealm) securityManager.getRealms().iterator().next();  userRealm.clearCachedAuthenticationInfo(subject().getPrincipals());  login(u1.getUsername(), password + "1"); } 

首先登錄成功(此時(shí)會緩存相應(yīng)的AuthenticationInfo),然后修改密碼;此時(shí)密碼就變了;接著需要調(diào)用Realm的clearCachedAuthenticationInfo方法清空之前緩存的AuthenticationInfo;否則下次登錄時(shí)還會獲取到修改密碼之前的那個(gè)AuthenticationInfo;

Java代碼  

@Test public void testClearCachedAuthorizationInfo() {  login(u1.getUsername(), password);  subject().checkRole(r1.getRole());  userService.correlationRoles(u1.getId(), r2.getId());   RealmSecurityManager securityManager =   (RealmSecurityManager) SecurityUtils.getSecurityManager();  UserRealm userRealm = (UserRealm)securityManager.getRealms().iterator().next();  userRealm.clearCachedAuthorizationInfo(subject().getPrincipals());  subject().checkRole(r2.getRole()); } 

和之前的用例差不多;此處調(diào)用Realm的clearCachedAuthorizationInfo清空之前緩存的AuthorizationInfo; 

另外還有clearCache,其同時(shí)調(diào)用clearCachedAuthenticationInfo和clearCachedAuthorizationInfo,清空AuthenticationInfo和AuthorizationInfo。 

UserRealm還提供了clearAllCachedAuthorizationInfo、clearAllCachedAuthenticationInfo、clearAllCache,用于清空整個(gè)緩存。

在某些清空下這種方式可能不是最好的選擇,可以考慮直接廢棄Shiro的緩存,然后自己通過如AOP機(jī)制實(shí)現(xiàn)自己的緩存;可以參考:

https://github.com/zhangkaitao/es/tree/master/web/src/main/java/com/sishuok/es/extra/aop

另外如果和Spring集成時(shí)可以考慮直接使用Spring的Cache抽象,可以考慮使用SpringCacheManagerWrapper,其對Spring Cache進(jìn)行了包裝,轉(zhuǎn)換為Shiro的CacheManager實(shí)現(xiàn):

https://github.com/zhangkaitao/es/blob/master/web/src/main/java/org/apache/shiro/cache/spring/SpringCacheManagerWrapper.java  

Session緩存

當(dāng)我們設(shè)置了SecurityManager的CacheManager時(shí),如:

Java代碼  

securityManager.cacheManager=$cacheManager 

當(dāng)我們設(shè)置SessionManager時(shí):

Java代碼 

sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager securityManager.sessionManager=$sessionManager 

如securityManager實(shí)現(xiàn)了SessionsSecurityManager,其會自動判斷SessionManager是否實(shí)現(xiàn)了CacheManagerAware接口,如果實(shí)現(xiàn)了會把CacheManager設(shè)置給它。然后sessionManager會判斷相應(yīng)的sessionDAO(如繼承自CachingSessionDAO)是否實(shí)現(xiàn)了CacheManagerAware,如果實(shí)現(xiàn)了會把CacheManager設(shè)置給它;如第九章的MySessionDAO就是帶緩存的SessionDAO;其會先查緩存,如果找不到才查數(shù)據(jù)庫。

對于CachingSessionDAO,可以通過如下配置設(shè)置緩存的名稱:

Java代碼  

sessionDAO=com.github.zhangkaitao.shiro.chapter11.session.dao.MySessionDAO sessionDAO.activeSessionsCacheName=shiro-activeSessionCache activeSessionsCacheName默認(rèn)就是shiro-activeSessionCache。

總結(jié)

以上所述是小編給大家介紹的shiro緩存機(jī)實(shí)例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對VEVB武林網(wǎng)網(wǎng)站的支持!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿拉善盟| 江达县| 阿巴嘎旗| 且末县| 高邮市| 九龙县| 海南省| 甘南县| 卢湾区| 中卫市| 吉水县| 南召县| 西和县| 冷水江市| 蛟河市| 怀柔区| 陕西省| 固镇县| 泌阳县| 寿阳县| 镇沅| 博罗县| 舞钢市| 通渭县| 鄂托克旗| 车险| 荔波县| 任丘市| 清河县| 斗六市| 洪洞县| 岫岩| 行唐县| 桦甸市| 千阳县| 太湖县| 内乡县| 桓台县| 寿光市| 泰兴市| 宁阳县|