對於分佈式系統,通常都牽扯到Session共享問題,
而想實現Session共享,就要實現Session的持久化操做,便是將內存中的Session持久化至緩存數據庫。java
SessionDAO是Shiro提供的一個數據交互層的interface接口,其做用是能夠將Session寫入到數據庫
中,而後能夠對Session進行增刪改查操做。web
經過下面的UML圖來看一下,Shiro爲咱們操做Session提供了哪些API。數據庫
其中SessionDao是最頂級的接口,它有一個簡單的實現叫AbstractSessionDAO,而在AbstractSessionDAO下
又有兩個實現類,分別是CachingSessionDAO和MemorySessionDAO,CachingSessionDAO提供了緩存的操做,
而MemorySessionDAO能夠讓咱們在內存中操做Session。apache
而CachingSessionDAO是一個抽象類,它有一個簡單的實現EnterpriseCacheSessionDAO,通常在開發過程當中推薦你們直接繼承EnterpriseCacheSessionDAO。緩存
總結:
(1)AbstractSessionDAO
提供了SessionDAO的基礎實現,如生成會話ID等。
(2)CachingSessionDAO
提供了對開發者透明的會話緩存的功能,須要設置相應的CacheManager。
(3)EnterpriseCacheSessionDAO
提供了緩存功能的會話維護,默認狀況下使用MapCache實現,內部使用
ConcurrentHashMap保存緩存的會話。session
一下是結合項目:分佈式
xmlide
<bean id="cluterShiroSessionDao" class="com.platform.shiro.CluterShiroSessionDao"/>
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- 設置session過時時間爲1小時(單位:毫秒),默認爲30分鐘 -->
<property name="globalSessionTimeout" value="3600000"></property>
<property name="sessionValidationSchedulerEnabled" value="true"></property>
<property name="sessionIdUrlRewritingEnabled" value="false"></property>
<property name="sessionDAO" ref="cluterShiroSessionDao"/>
</bean>
CluterShiroSessionDao.java
public class CluterShiroSessionDao extends EnterpriseCacheSessionDAO { //建立Session(它實現了CachingSessionDAO接口的方法) @Override protected Serializable doCreate(Session session) { Serializable sessionId = super.doCreate(session); final String key = Constant.SESSION_KEY + sessionId.toString(); setShiroSession(key, session); return sessionId; } //根據sessionId讀取session信息(它實現了CachingSessionDAO接口的方法) @Override protected Session doReadSession(Serializable sessionId) { Session session = super.doReadSession(sessionId); if (null == session) { final String key = Constant.SESSION_KEY + sessionId.toString(); session = getShiroSession(key); } return session; } //更新操做(它實現了CachingSessionDAO接口的方法) @Override protected void doUpdate(Session session) { super.doUpdate(session); final String key = Constant.SESSION_KEY + session.getId().toString(); setShiroSession(key, session); } //刪除操做(它實現了CachingSessionDAO接口的方法) @Override protected void doDelete(Session session) { super.doDelete(session); final String key = Constant.SESSION_KEY + session.getId().toString(); J2CacheUtils.remove(key); } private Session getShiroSession(String key) { return (Session) J2CacheUtils.get(key); } private void setShiroSession(String key, Session session) { J2CacheUtils.put(key, session); } }