shiro 的session持久化

對於分佈式系統,通常都牽扯到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);
    }
}
相關文章
相關標籤/搜索