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>
缓存管理器,用于管理缓存的,此处使用Ehcache实现
<!-- 缓存管理器 -->
<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分别代表创建/修改/删除/读取会话。