shiro的会话存储/持久化SessionDAO

Shiro提供SessionDAO用于会话的CRUD,即DAO(Data Access Object)模式实现:

[java]  view plain  copy
  1. public interface SessionDAO {  
  2.     /*如DefaultSessionManager在创建完session后会调用该方法; 
  3.       如保存到关系数据库/文件系统/NoSQL数据库;即可以实现会话的持久化; 
  4.       返回会话ID;主要此处返回的ID.equals(session.getId());   
  5.     */    
  6.     Serializable create(Session session);    
  7.       
  8.     //根据会话ID获取会话    
  9.     Session readSession(Serializable sessionId) throws UnknownSessionException;    
  10.       
  11.     //更新会话;如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用    
  12.     void update(Session session) throws UnknownSessionException;    
  13.       
  14.     //删除会话;当会话过期/会话停止(如用户退出时)会调用    
  15.     void delete(Session session);    
  16.       
  17.     //获取当前所有活跃用户,如果用户量多此方法影响性能    
  18.     Collection<Session> getActiveSessions();     
  19. }  

Shiro的SessionDAO实现


AbstractSessionDAO提供了SessionDAO的基础实现,如生成会话ID等;
CachingSessionDAO提供了对开发者透明的会话缓存的功能,只需要设置相应的CacheManager即可;
MemorySessionDAO直接在内存中进行会话维护;
EnterpriseCacheSessionDAO提供了缓存功能的会话维护,默认情况下使用MapCache实现,内部使用ConcurrentHashMap保存缓存的会话。

可以通过如下配置设置SessionDAO

[html]  view plain  copy
  1. <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">  
  2.     <!--设置Session缓存名字,默认就是shiro-activeSessionCache-->  
  3.     <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>  
  4.     <!-- 用于生成会话ID,默认就是JavaUuidSessionIdGenerator,使用java.util.UUID生成 -->  
  5.     <property name="sessionIdGenerator" value="sessionIdGenerator"/>  
  6. </bean>  
<!-- 会话管理器 -->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">    	
        <property name="sessionDAO" ref="sessionDAO"/>
        
        <!-- 会话超时时间,单位:3600000毫秒 =1小时 -->
        <property name="globalSessionTimeout" value="1800000"/>
        
        <!-- 定时清理失效会话, 清理用户直接关闭浏览器造成的孤立会话   -->
        <property name="sessionValidationInterval" value="60000"/>
<!--          <property name="sessionValidationSchedulerEnabled" value="false"/> -->
         <property name="sessionValidationSchedulerEnabled" value="true"/>
         
        <property name="sessionIdCookie" ref="sessionIdCookie"/>
        <property name="sessionIdCookieEnabled" value="true"/>
    </bean>

[html]  view plain  copy
  1. <!-- 缓存管理器 -->  
  2. <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
  3.     <!-- 设置ehcache缓存的配置文件 -->  
  4.     <property name="cacheManagerConfigFile" value="classpath:cache/shiro-ehcache.xml"/>  
  5. </bean>  

配置ehcache.xml,Cache的名字为shiro-activeSessionCache,即设置的sessionDAO的activeSessionsCacheName属性值。

[html]  view plain  copy
  1. <cache name="shiro-activeSessionCache"    
  2.        maxEntriesLocalHeap="10000"    
  3.        overflowToDisk="false"    
  4.        eternal="false"    
  5.        diskPersistent="false"    
  6.        timeToLiveSeconds="0"    
  7.        timeToIdleSeconds="0"    
  8.        statistics="true"/>   

配置设置会话ID生成器,

[html]  view plain  copy
  1. <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator "/>  

如果自定义实现SessionDAO,继承CachingSessionDAO即可,doCreate/doUpdate/doDelete/doReadSession分别代表创建/修改/删除/读取会话。

猜你喜欢

转载自blog.csdn.net/qq_33223299/article/details/80688602