一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解shiro緩存機制

詳解shiro緩存機制

2021-01-06 11:08動力節點 Java教程

Shiro提供了類似于Spring的Cache抽象,即Shiro本身不實現Cache,但是對Cache進行了又抽象,方便更換不同的底層Cache實現。下面通過實例代碼給大家分享shiro緩存機制,感興趣的朋友一起看看吧

Shiro提供了類似于Spring的Cache抽象,即Shiro本身不實現Cache,但是對Cache進行了又抽象,方便更換不同的底層Cache實現。 

Shiro提供的Cache接口: 

Java代碼  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface Cache<K, V> {
 //根據Key獲取緩存中的值
 public V get(K key) throws CacheException;
 //往緩存中放入key-value,返回緩存中之前的值
 public V put(K key, V value) throws CacheException;
 //移除緩存中key對應的值,返回該值
 public V remove(K key) throws CacheException;
 //清空整個緩存
 public void clear() throws CacheException;
 //返回緩存大小
 public int size();
 //獲取緩存中所有的key
 public Set<K> keys();
 //獲取緩存中所有的value
 public Collection<V> values();
}

Shiro提供的CacheManager接口: 

Java代碼  

?
1
2
3
4
public interface CacheManager {
 //根據緩存名字獲取一個Cache
 public <K, V> Cache<K, V> getCache(String name) throws CacheException;
}

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

Java代碼  

?
1
2
3
4
public interface CacheManagerAware {
 //注入CacheManager
 void setCacheManager(CacheManager cacheManager);
}

Shiro內部相應的組件(DefaultSecurityManager)會自動檢測相應的對象(如Realm)是否實現了CacheManagerAware并自動注入相應的CacheManager。   

Realm緩存

Shiro提供了CachingRealm,其實現了CacheManagerAware接口,提供了緩存的一些基礎實現;另外AuthenticatingRealm及AuthorizingRealm分別提供了對AuthenticationInfo 和AuthorizationInfo信息的緩存。 

ini配置  

Java代碼  

?
1
2
3
4
5
6
7
8
9
10
11
userRealm=com.github.zhangkaitao.shiro.chapter11.realm.UserRealm
userRealm.credentialsMatcher=$credentialsMatcher
userRealm.cachingEnabled=true
userRealm.authenticationCachingEnabled=true
userRealm.authenticationCacheName=authenticationCache
userRealm.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:啟用緩存,默認false;

userRealm.authenticationCachingEnabled:啟用身份驗證緩存,即緩存AuthenticationInfo信息,默認false;

userRealm.authenticationCacheName:緩存AuthenticationInfo信息的緩存名稱;

userRealm. authorizationCachingEnabled:啟用授權緩存,即緩存AuthorizationInfo信息,默認false;

userRealm. authorizationCacheName:緩存AuthorizationInfo信息的緩存名稱;

cacheManager:緩存管理器,此處使用EhCacheManager,即Ehcache實現,需要導入相應的Ehcache依賴,請參考pom.xml; 

因為測試用例的關系,需要將Ehcache的CacheManager改為使用VM單例模式:

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

改為

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

測試用例 

Java代碼  

?
1
2
3
4
5
6
7
8
9
10
@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");
}

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

Java代碼 

?
1
2
3
4
5
6
7
8
9
10
11
12
@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());
}

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

另外還有clearCache,其同時調用clearCachedAuthenticationInfo和clearCachedAuthorizationInfo,清空AuthenticationInfo和AuthorizationInfo。

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

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

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

另外如果和Spring集成時可以考慮直接使用Spring的Cache抽象,可以考慮使用SpringCacheManagerWrapper,其對Spring Cache進行了包裝,轉換為Shiro的CacheManager實現:

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

Session緩存

當我們設置了SecurityManager的CacheManager時,如:

Java代碼 

?
1
securityManager.cacheManager=$cacheManager

當我們設置SessionManager時:

Java代碼  

?
1
2
sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager
securityManager.sessionManager=$sessionManager

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

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

Java代碼  

?
1
2
3
sessionDAO=com.github.zhangkaitao.shiro.chapter11.session.dao.MySessionDAO
sessionDAO.activeSessionsCacheName=shiro-activeSessionCache
activeSessionsCacheName默認就是shiro-activeSessionCache。

總結

以上所述是小編給大家介紹的shiro緩存機制,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wwb3.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男人与雌性宠物交啪啪小说 | 国产91在线免费 | mm131亚洲精品久久 | 奇米影视在线观看 | 沉沦艳妇杨幂肉体小说 | 欧美人禽杂交狂配无删完整 | 免费观看a毛片一区二区不卡 | 非洲黑女人性xxxx | 天天曰| 91制片厂制作果冻传媒2021 | 精品久久久久久久久久久久久久久 | 成人快手破解版 | 久久理论片 | 男人的天堂comwww | 日韩毛片免费在线观看 | 亚洲 制服 欧美 中文字幕 | 韩国美女豪爽一级毛片 | 毛茸茸的大逼 | 狐媚小说 | 2022色婷婷综合久久久 | 日韩精品高清自在线 | 亚欧洲乱码视频一二三区 | 亚洲欧美在线观看首页 | 日韩乱淫 | 拍拍叫痛的无挡视频免费 | 大胆暴露亚洲美女xxxx | 99热这里有免费国产精品 | 天天有好逼 | 亚洲午夜久久久久国产 | 男同gay玩奴男同玩奴 | 日产中文乱码卡一卡二 | 手机在线观看国产精选免费 | 青青草在线观看 | 九九精品成人免费国产片 | 大陆日韩欧美 | 秘书小说阿蛮 | 天天做日日爱 | 免费成年网站 | 无限在线观看视频大全免费高清 | 欧美精品成人a多人在线观看 | 色综合天天综合中文网 |