集群環境下Shiro Session的管理


問題引入

緊接上篇連接

在多台tomcat集群中,shiro管理的session需要放在Redis中,我們只需要增加redisSessionDAO的配置就行

    <!-- 定義會話管理器的操作  表示當前web開發中的session的處理操作都由shiro操作控制 -->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- 定義Session可以進行序列化的工具類 -->
        <property name="sessionDAO" ref="redisSessionDAO" />  
        <property name="sessionIdUrlRewritingEnabled" value="false" />
    </bean>

sessionDao的實現

public class RedisSessionDAO extends EnterpriseCacheSessionDAO {
    public static final String prefix = "shrio_redis:";
    @Resource
    private RedisTemplate<String, Object> redisTempate; // 要提供有Redis處理工具類
    @Override
    protected Serializable doCreate(Session session) { // 創建Session,返回session id
        Serializable sessionId = super.doCreate(session); // 創建sessionid
        // 將當前創建好的Session的數據保存在Redis數據庫里面
        this.redisTempate.opsForValue().set(prefix+sessionId.toString(), session,6000);
        return sessionId;
    }
    @Override
    protected Session doReadSession(Serializable sessionId) { // 根據session
        Session session = (Session) redisTempate.opsForValue().get(prefix+sessionId.toString());// id讀取session數據
        return session;
    }
    @Override
    protected void doUpdate(Session session) { // 實現Session更新,每次操作都要更新
        super.doUpdate(session);
        if (session != null) {
            this.redisTempate.opsForValue().set(prefix+session.getId().toString(),session, 1800);
        }
    }
    @Override
    protected void doDelete(Session session) { // session的刪除處理
        super.doDelete(session);
        this.redisTempate.delete(prefix+session.getId().toString());
    }
}

工具類redisTemplate

上面代碼中使用到了redisTemplate,但是redisTemplate默認的序列化方式有缺點,再此我們從新指定序列化方式。

   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
        </property> 
    </bean>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM