shiro安全框架擴充套件教程--如何擴充套件實現我們的快取機制(第三方容器redis,memcached)
大家都知道有點規模的專案都必須會使用快取這個好東西,所以一個好的框架基本都會包含一套多級快取的機制,例如spring,hibernate等也會有自己一套,象第三方的oscache,ehcache等等;
不扯沒營養的話了,還是說回shiro的快取,shiro的快取比較簡單,我們可以看看shiro定義的cache介面原始碼
- package org.apache.shiro.cache;
- import java.util.Collection;
- import java.util.Set;
- // Referenced classes of package org.apache.shiro.cache:
- // CacheException
- public interface Cache
- {
- public abstract Object get(Object obj)
- throws CacheException;
- public abstract Object put(Object obj, Object obj1)
- throws CacheException;
- public abstract Object remove(Object obj)
- throws CacheException;
- public abstract void clear()
- throws CacheException;
- public abstract int size();
- public abstract Set keys();
- public abstract Collection values();
- }
很明顯看到跟我們普通的cache差不多,也是CRUD等等方法,然後看看有shiro寫的有哪些實現類
一個是org.apache.shiro.cache.ehcache.EhCache
一個是org.apache.shiro.cache.MapCache
然後看著名字我們就大概知道一個是基於encache框架來作為實現類基礎,一個是以本地map來裝載資料到記憶體達到快取的效果,這裡類的原始碼可以自己看看,比較簡單,shiro入門後的都能看懂,但是這些實現類都不適合我用,我想要的是用memcached或是redis作為資料的快取容器
下面我就來分享下自己的實現流程
上面我們已經看過shiro的cache介面,下面我們就實現一個序列化的cache實現類
- /**
- *
- * 快取實現類,實現序列 介面方便物件儲存於第三方容器(Map存放鍵值對)
- *
- *
- */
- @SuppressWarnings("serial")
- public class SimpleMapCache implements Cache<Object, Object>, Serializable {
- private final Map<Object, Object> attributes;
- private final String name;
- public SimpleMapCache(String name, Map<Object, Object> backingMap) {
- if (name == null)
- throw new IllegalArgumentException("Cache name cannot be null.");
- if (backingMap == null) {
- throw new IllegalArgumentException("Backing map cannot be null.");
- } else {
- this.name = name;
- attributes = backingMap;
- }
- }
- public Object get(Object key) throws CacheException {
- return attributes.get(key);
- }
- public Object put(Object key, Object value) throws CacheException {
- return attributes.put(key, value);
- }
- public Object remove(Object key) throws CacheException {
- return attributes.remove(key);
- }
- public void clear() throws CacheException {
- attributes.clear();
- }
- public int size() {
- return attributes.size();
- }
- public Set<Object> keys() {
- Set<Object> keys = attributes.keySet();
- if (!keys.isEmpty())
- return Collections.unmodifiableSet(keys);
- else
- return Collections.emptySet();
- }
- public Collection<Object> values() {
- Collection<Object> values = attributes.values();
- if (!CollectionUtils.isEmpty(values))
- return Collections.unmodifiableCollection(values);
- else
- return Collections.emptySet();
- }
- public String toString() {
- return (new StringBuilder("SimpleMapCache '")).append(name).append("' (").append(attributes.size()).append(
- " entries)").toString();
- }
- }
其實上面的cache實現我直接用mapcache實現類的原始碼然後增加實現序列化的介面,比較方便
然後我們把自己的資源搞到一個map裡,然後new SimpleMapCache(Map)就生成一個快取堆,最後新增到快取管理器裡面即可
下面我們看看如何實現快取管理器
所以我們先實現一個自定義的快取管理器介面方便我們操作每一個快取堆
- /**
- *
- * 快取管理器介面
- *
- * @author shadow
- *
- */
- public interface SimpleCacheManager {
- /**
- * 新增快取堆到管理器
- *
- * @param name
- * @param cache
- */
- public abstract void createCache(String name, Cache<Object, Object> cache) throws CacheException;
- /**
- * 獲取快取堆
- *
- * @param name
- * @return
- * @throws CacheException
- */
- public abstract Cache<Object, Object> getCache(String name) throws CacheException;
- /**
- * 移除快取堆
- *
- * @param name
- * @throws CacheException
- */
- public abstract void removeCache(String name) throws CacheException;
- /**
- * 更新快取堆
- *
- * @param name
- * @param cache
- */
- public abstract void updateCahce(String name, Cache<Object, Object> cache) throws CacheException;
- /**
- * 登出管理器
- */
- public abstract void destroy() throws CacheException;
- }
介面已經定義好,我們就寫一個實現類完成我們的邏輯,並且這個邏輯是把快取堆物件放到memcached裡面
- /**
- *
- * 快取管理器實現類
- *
- * @author shadow
- *
- */
- public class SimpleCacheManagerImpl implements SimpleCacheManager {
- private MemcachedClient memcachedClient;
- public SimpleCacheManagerImpl(MemcachedClient memcachedClient) {
- if (memcachedClient == null) {
- throw new RuntimeException("必須存在memcached客戶端例項");
- }
- this.memcachedClient = memcachedClient;
- }
- @Override
- public void createCache(String name, Cache<Object, Object> cache) throws CacheException {
- try {
- memcachedClient.set(name, 0, cache);
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
- @Override
- public Cache<Object, Object> getCache(String name) throws CacheException {
- try {
- return memcachedClient.get(name);
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
- @Override
- public void removeCache(String name) throws CacheException {
- try {
- memcachedClient.delete(name);
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
- @Override
- public void updateCahce(String name, Cache<Object, Object> cache) throws CacheException {
- try {
- memcachedClient.replace(name, 0, cache);
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
- @Override
- public void destroy() throws CacheException {
- try {
- memcachedClient.shutdown();
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
- }
然後我們就開始把這自定義的管理器接入到shiro的快取管理器
- /**
- *
- * 安全框架快取管理器實現類
- *
- * @author shadow
- *
- */
- public class ShiroCacheManager implements CacheManager, Destroyable {
- private SimpleCacheManager simpleCacheManager;
- @Override
- public Cache<Object, Object> getCache(String name) throws CacheException {
- return simpleCacheManager.getCache(name);
- }
- @Override
- public void destroy() throws Exception {
- simpleCacheManager.destroy();
- }
- public SimpleCacheManager getSimpleCacheManager() {
- return simpleCacheManager;
- }
- public void setSimpleCacheManager(SimpleCacheManager simpleCacheManager) {
- this.simpleCacheManager = simpleCacheManager;
- }
- }
最後配置下這個shiro的管理器實現類注入到需要的地方即可
- <!-- 安全管理器 -->
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="sessionManager" ref="sessionManager" />
- <property name="cacheManager" ref="shiroCacheManager" />
- <property name="realm" ref="simpleUserRealm" />
- </bean>
- <!-- 安全框架快取管理器 -->
- <bean id="shiroCacheManager" class="com.silvery.security.shiro.cache.ShiroCacheManager">
- <property name="simpleCacheManager" ref="simpleCacheManager" />
- </bean>
- <!-- 擴充套件快取管理器 -->
- <bean id="simpleCacheManager"
- class="com.silvery.security.shiro.cache.extend.impl.SimpleCacheManagerImpl">
- <constructor-arg ref="memcachedClient" />
- </bean>
配置好了之後,我們在需要地方把例項化的SimpeMapCache新增到我們的自己的管理器裡面即可...
相關文章
- Spring容器擴充套件機制Spring套件
- shiro安全框架擴充套件教程–異常退出沒有清除快取資訊處理方案框架套件快取
- 新增php的memcached擴充套件模組PHP套件
- CONNECT BY 擴充套件用法,實現獲取bom級聯擴充套件數量套件
- JMeter 擴充套件開發:擴充套件 TCP 取樣器JMeter套件TCP
- shiro安全框架擴充套件教程–如何防止可執行檔案的入侵攻擊框架套件
- php7安裝redis擴充套件和memcache擴充套件PHPRedis套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- MOSN 擴充套件機制解析套件
- PHPmemcache和memcached擴充套件的區別PHP套件
- PHP擴充套件快取加速安裝PHP套件快取
- Redis 實戰 —— 13. 擴充套件 RedisRedis套件
- AFNetworking 之 UIKit 擴充套件與快取實現UI套件快取
- 擴充套件JAAS,XMLPolicyFile實現套件XML
- dubbo是如何實現可擴充套件的?套件
- Spring IoC 容器的擴充套件Spring套件
- WCF擴充套件:行為擴充套件Behavior Extension套件
- 1.2 - Laravel 5.6 - Extend 擴充套件機制Laravel套件
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- 聊聊Dubbo - Dubbo可擴充套件機制實戰套件
- 淺析Dubbo的SPI擴充套件機制套件
- 聊聊spring的那些擴充套件機制Spring套件
- PHPWAMP安裝Redis擴充套件的方式與相關擴充套件的下載PHPRedis套件
- PHP安裝redis擴充套件PHPRedis套件
- php8.2 redis擴充套件PHPRedis套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 知識庫(2)-使用Windows OpenGL擴充套件機制來訪問OpenGL擴充套件 (轉)Windows套件
- dubbo是如何實現可擴充套件的?(二)套件
- Sanic 擴充套件套件
- ORACLE 擴充套件Oracle套件
- 擴充套件工具套件
- 擴充套件歐幾里得套件
- DOM擴充套件套件
- 擴充套件ACL套件
- Lua擴充套件套件
- 照片擴充套件套件
- 擴充套件篇套件
- disable or 擴充套件套件