久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

我的shiro之旅: 七 shiro session 共享

 WindySky 2017-12-27

很久沒有寫過博文,,一來是因為工作比較緊,,二來是因為很長一段時間沒有寫博文的心情,。今天,,想繼續(xù)寫寫shiro的一些文章,,這篇文章只要想分享的是shiro 共享session的內(nèi)容,。

        在這里先給出我的shiro配置文件,。

      

  1.        <bean id="shiroRealm" class="com.concom.security.infrastructure.shiro.ShiroRealm"/>  
  2.   
  3. <bean id="shiroCacheManager" class="com.concom.security.infrastructure.shiro.cache.ShiroCacheManager"/>  
  4.   
  5. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  6.     <property name="realm" ref="shiroRealm" />  
  7.     <!-- <property name="sessionMode" value="native"/> -->  
  8.     <property name="cacheManager" ref="shiroCacheManager"/>  
  9.     <property name="sessionManager" ref="shiroSessionManager"/>  
  10.     <!-- <property name="subjectDAO" ref="subjectDAO"/> -->  
  11. </bean>  
  12.   
  13.   
  14. <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">  
  15.     <!-- <property name="sessionIdGenerator" ref="sessionIdGenerator"/> -->  
  16. </bean>  
  17. <!-- <bean id="sessionIdGenerator" class="com.concom.security.infrastructure.shiro.ShiroSessionIdGenerator"/> -->  
  18.   
  19. <bean id="shiroSessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">  
  20.     <property name="sessionDAO" ref="sessionDAO"/>  
  21.     <!-- <property name="sessionValidationScheduler" ref="shiroSessionValidationScheduler"/> -->  
  22.     <property name="sessionValidationInterval" value="1800000"/>  <!-- 相隔多久檢查一次session的有效性 -->  
  23.     <property name="globalSessionTimeout" value="1800000"/>  <!-- session 有效時間為半小時 (毫秒單位)-->  
  24.     <property name="sessionIdCookie.domain" value="${domain}"/>  
  25.     <property name="sessionIdCookie.name" value="${sessionId_name}"/>  
  26.     <property name="sessionIdCookie.path" value="${path}"/>  
  27.     <!-- <property name="sessionListeners">  
  28.         <list>  
  29.             <bean class="com.concom.security.interfaces.listener.SessionListener"/>  
  30.         </list>  
  31.     </property> -->  
  32. </bean>  
  33.   
  34.   
  35. <!-- <bean id="shiroSessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">  
  36.     <constructor-arg name="sessionManager" ref="sessionManager"/>  
  37.     <property name="interval" value="10000"/>  定時半小時檢驗一次有所session是否有效(毫秒單位)  
  38. </bean> -->  
  39.   
  40.   
  41. <!-- Post processor that automatically invokes init() and destroy() methods -->  
  42. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />  

從shiro的DefaultWebSecurityManager源碼中我們可以看到,,該類繼承了CachingSecurityManager類,CachingSecurityManager里有個CacheManager屬性,,這就是shiro的cache,,我們主要實現(xiàn)這個cache就可以。貼出源碼,。

  1. public abstract class CachingSecurityManager implements SecurityManager, Destroyable, CacheManagerAware {  
  2.   
  3.     /** 
  4.      * The CacheManager to use to perform caching operations to enhance performance.  Can be null. 
  5.      */  
  6.     private CacheManager cacheManager;  
  7.   
  8.     /** 
  9.      * Default no-arg constructor that will automatically attempt to initialize a default cacheManager 
  10.      */  
  11.     public CachingSecurityManager() {  
  12.     }  
  13.   
  14.     /** 
  15.      * Returns the CacheManager used by this SecurityManager. 
  16.      * 
  17.      * @return the cacheManager used by this SecurityManager 
  18.      */  
  19.     public CacheManager getCacheManager() {  
  20.         return cacheManager;  
  21.     }  
  22.   
  23.     /** 
  24.      * Sets the CacheManager used by this {@code SecurityManager} and potentially any of its 
  25.      * children components. 
  26.      * <p/> 
  27.      * After the cacheManager attribute has been set, the template method 
  28.      * {@link #afterCacheManagerSet afterCacheManagerSet()} is executed to allow subclasses to adjust when a 
  29.      * cacheManager is available. 
  30.      * 
  31.      * @param cacheManager the CacheManager used by this {@code SecurityManager} and potentially any of its 
  32.      *                     children components. 
  33.      */  
  34.     public void setCacheManager(CacheManager cacheManager) {  
  35.         this.cacheManager = cacheManager;  
  36.         afterCacheManagerSet();  
  37.     }  
  38.   
  39.     /** 
  40.      * Template callback to notify subclasses that a 
  41.      * {@link org.apache.shiro.cache.CacheManager CacheManager} has been set and is available for use via the 
  42.      * {@link #getCacheManager getCacheManager()} method. 
  43.      */  
  44.     protected void afterCacheManagerSet() {  
  45.     }  
  46.   
  47.     /** 
  48.      * Destroys the {@link #getCacheManager() cacheManager} via {@link LifecycleUtils#destroy LifecycleUtils.destroy}. 
  49.      */  
  50.     public void destroy() {  
  51.         LifecycleUtils.destroy(getCacheManager());  
  52.         this.cacheManager = null;  
  53.     }  
  54.   
  55. }  
cacheManager是一個接口,,shiro給出了一個實現(xiàn),就是MemoryConstrainedCacheManager,,下面也貼出MemoryConstrainedCacheManager的源碼,。

  1. public class MemoryConstrainedCacheManager extends AbstractCacheManager {  
  2.   
  3.     /** 
  4.      * Returns a new {@link MapCache MapCache} instance backed by a {@link SoftHashMap}. 
  5.      * 
  6.      * @param name the name of the cache 
  7.      * @return a new {@link MapCache MapCache} instance backed by a {@link SoftHashMap}. 
  8.      */  
  9.     @Override  
  10.     protected Cache createCache(String name) {  
  11.         return new MapCache<Object, Object>(name, new SoftHashMap<Object, Object>());  
  12.     }  
  13. }  

從MemoryConstrainedCacheManager我們可以看到,MemoryConstrainedCacheManager繼承了AbstractCacheManager,,我們自己建一個類,,也繼承AbstractCacheManager,然后實現(xiàn)createCache(String name)方法,,替換shiro的默認實現(xiàn)即可,。在這里,,也給出我的實現(xiàn)。

  1. package com.concom.security.infrastructure.shiro.cache;  
  2.   
  3. import org.apache.shiro.cache.AbstractCacheManager;  
  4. import org.apache.shiro.cache.Cache;  
  5. import org.apache.shiro.cache.CacheException;  
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8.   
  9. import com.concom.security.infrastructure.shiro.cache.memcache.ShiroMemcachedCache;  
  10.   
  11. /** 
  12.  * @author Dylan 
  13.  * @time 2014年1月6日 
  14.  */  
  15. @SuppressWarnings("rawtypes")  
  16. public class ShiroCacheManager extends AbstractCacheManager {  
  17.   
  18.     private static final Logger log = LoggerFactory.getLogger(ShiroCacheManager.class);  
  19.   
  20.     @Override  
  21.     protected Cache createCache(String cacheName) throws CacheException {  
  22.   
  23.         if (log.isTraceEnabled()) {  
  24.             log.trace("create a cache name : " + cacheName);  
  25.         }  
  26.   
  27.         return new ShiroMemcachedCache<Object, Object>(cacheName);  
  28.     }  
  29.   
  30. }  

createCache方法返回的是一個Cache,,Cache也是一個接口,,我寫了一個ShiroMemcachedCache,實現(xiàn)了Cache,。ShiroMemcachedCache主要是對緩存的一些增刪改查的操作,。其中ShiroMemcachedCache的實現(xiàn)如下:

  1. package com.concom.security.infrastructure.shiro.cache.memcache;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collection;  
  5. import java.util.HashSet;  
  6. import java.util.Iterator;  
  7. import java.util.List;  
  8. import java.util.Set;  
  9.   
  10. import org.apache.commons.lang.StringUtils;  
  11. import org.apache.shiro.cache.Cache;  
  12. import org.apache.shiro.cache.CacheException;  
  13. import org.slf4j.Logger;  
  14. import org.slf4j.LoggerFactory;  
  15.   
  16. import com.concom.security.infrastructure.memcache.MemcacheRepository;  
  17. /** 
  18.  * @author Dylan 
  19.  * @time 2014年1月6日 
  20.  * @param <K> 
  21.  * @param <V> 
  22.  */  
  23. @SuppressWarnings("unchecked")  
  24. public class ShiroMemcachedCache<K,V> implements Cache<K, V>  {  
  25.       
  26.     private static MemcacheRepository cache;  
  27.       
  28.     private String CACHE_PREFIX;  
  29.       
  30.     private final static Logger LOG = LoggerFactory.getLogger(ShiroMemcachedCache.class);  
  31.       
  32.       
  33.     public ShiroMemcachedCache(String cacheName){  
  34.         CACHE_PREFIX = cacheName+"-";  
  35.     }  
  36.       
  37.     @Override  
  38.     public V get(K key) throws CacheException {  
  39.         V value = ((V)getCache().get(keyToString(key)));  
  40.         if(LOG.isDebugEnabled()){  
  41.             LOG.debug("get the entity json is " + key + " : " + value);  
  42.         }  
  43.         return value;  
  44.     }  
  45.   
  46.     @Override  
  47.     public V put(K key, V value) throws CacheException {  
  48.         if(LOG.isDebugEnabled()){  
  49.             LOG.debug("begin save the "+ key + " : " + value+" to memcache");  
  50.         }  
  51.         getCache().save(keyToString(key), value);  
  52.         return value;  
  53.     }  
  54.   
  55.     @Override  
  56.     public V remove(K key) throws CacheException {  
  57.         if(LOG.isDebugEnabled()){  
  58.             LOG.debug("begin remove the "+key+" from memcache");  
  59.         }  
  60.         V value = get(key);  
  61.         getCache().remove(keyToString(key));  
  62.         return value;  
  63.     }  
  64.   
  65.     @Override  
  66.     public void clear() throws CacheException {  
  67.         for(Iterator<K> keys =keys().iterator();keys.hasNext();){  
  68.             K key = keys.next();  
  69.             remove(key);  
  70.         }  
  71.     }  
  72.   
  73.     @Override  
  74.     public int size() {  
  75.         return keys().size();  
  76.     }  
  77.   
  78.     @Override  
  79.     public Set<K> keys() {  
  80.         Set<String> keys = new HashSet<String>();  
  81.         for(String key : getCache().keys()){  
  82.             if(StringUtils.startsWith(key, CACHE_PREFIX)){  
  83.                 keys.add(key);  
  84.             }  
  85.         }  
  86.         return (Set<K>)keys ;  
  87.     }  
  88.   
  89.     @Override  
  90.     public Collection<V> values() {  
  91.         List<V> values = new ArrayList<V>();  
  92.         for(Iterator<K> keys =keys().iterator();keys.hasNext();){  
  93.             K key = keys.next();  
  94.             V value = getValue(key);  
  95.             values.add(value);  
  96.         }  
  97.         return values;  
  98.     }  
  99.       
  100.     private V getValue(K key) throws CacheException {  
  101.         V value = ((V)getCache().get(String.valueOf(key)));  
  102.         if(LOG.isDebugEnabled()){  
  103.             LOG.debug("get the entity json is " + key + " : " + value);  
  104.         }  
  105.         return value;  
  106.     }  
  107.       
  108.     private String keyToString(K key){  
  109.         String k = String.valueOf(key);  
  110.         if(StringUtils.startsWith(k, CACHE_PREFIX)){  
  111.             return k;  
  112.         }  
  113.         return CACHE_PREFIX+k;  
  114.     }  
  115.   
  116.     public static MemcacheRepository getCache() {  
  117.         return cache;  
  118.     }  
  119.   
  120.     public static void setCache(MemcacheRepository cache) {  
  121.         ShiroMemcachedCache.cache = cache;  
  122.     }  
  123.   
  124. }  


上面緩存用的是memcached。這樣,,shiro的緩存共享就完成了,。篇幅有點長,這篇先寫到這里,,下一篇將繼續(xù)講shiro的cache共享,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多