Shiro提供SessionDAO用于会话的CRUD,即DAO(Data Access Object)模式实现:
- public interface SessionDAO {
- /*如DefaultSessionManager在创建完session后会调用该方法;
- 如保存到关系数据库/文件系统/NoSQL数据库;即可以实现会话的持久化;
- 返回会话ID;主要此处返回的ID.equals(session.getId());
- */
- Serializable create(Session session);
- //根据会话ID获取会话
- Session readSession(Serializable sessionId) throws UnknownSessionException;
- //更新会话;如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用
- void update(Session session) throws UnknownSessionException;
- //删除会话;当会话过期/会话停止(如用户退出时)会调用
- void delete(Session session);
- //获取当前所有活跃用户,如果用户量多此方法影响性能
- Collection<Session> getActiveSessions();
- }
Shiro的SessionDAO实现
AbstractSessionDAO提供了SessionDAO的基础实现,如生成会话ID等;
CachingSessionDAO提供了对开发者透明的会话缓存的功能,只需要设置相应的CacheManager即可;
MemorySessionDAO直接在内存中进行会话维护;
EnterpriseCacheSessionDAO提供了缓存功能的会话维护,默认情况下使用MapCache实现,内部使用ConcurrentHashMap保存缓存的会话。
可以通过如下配置设置SessionDAO
- <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
- <!--设置Session缓存名字,默认就是shiro-activeSessionCache-->
- <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
- <!-- 用于生成会话ID,默认就是JavaUuidSessionIdGenerator,使用java.util.UUID生成 -->
- <property name="sessionIdGenerator" value="sessionIdGenerator"/>
- </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>
- <!-- 缓存管理器 -->
- <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
- <!-- 设置ehcache缓存的配置文件 -->
- <property name="cacheManagerConfigFile" value="classpath:cache/shiro-ehcache.xml"/>
- </bean>
配置ehcache.xml,Cache的名字为shiro-activeSessionCache,即设置的sessionDAO的activeSessionsCacheName属性值。
- <cache name="shiro-activeSessionCache"
- maxEntriesLocalHeap="10000"
- overflowToDisk="false"
- eternal="false"
- diskPersistent="false"
- timeToLiveSeconds="0"
- timeToIdleSeconds="0"
- statistics="true"/>
配置设置会话ID生成器,
- <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator "/>
如果自定义实现SessionDAO,继承CachingSessionDAO即可,doCreate/doUpdate/doDelete/doReadSession分别代表创建/修改/删除/读取会话。