欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring boot整合redis實現(xiàn)shiro的分布式session共享的方法

 更新時間:2018年01月26日 16:11:32   作者:牛奮lch  
本篇文章主要介紹了spring boot整合redis實現(xiàn)shiro的分布式session共享的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

我們知道,shiro是通過SessionManager來管理Session的,而對于Session的操作則是通過SessionDao來實現(xiàn)的,默認的情況下,shiro實現(xiàn)了兩種SessionDao,分別為CachingSessionDAO和MemorySessionDAO,當我們使用EhCache緩存時,則是使用的CachingSessionDAO,不適用緩存的情況下,就會選擇基于內存的SessionDao.所以,如果我們想實現(xiàn)基于Redis的分布式Session共享,重點在于重寫SessionManager中的SessionDao。我們的重寫代碼如下:

package com.chhliu.springboot.shiro.cache; 
import java.io.Serializable; 
import java.util.Collection; 
import java.util.concurrent.TimeUnit; 
import org.apache.shiro.session.Session; 
import org.apache.shiro.session.UnknownSessionException; 
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.redis.core.RedisTemplate; 
import org.springframework.stereotype.Service;  
@Service 
@SuppressWarnings({ "rawtypes", "unchecked" }) 
public class RedisSessionDao extends AbstractSessionDAO { 
 
  // Session超時時間,單位為毫秒 
  private long expireTime = 120000; 
 
  @Autowired 
  private RedisTemplate redisTemplate;// Redis操作類,對這個使用不熟悉的,可以參考前面的博客 
 
  public RedisSessionDao() { 
    super(); 
  } 
 
  public RedisSessionDao(long expireTime, RedisTemplate redisTemplate) { 
    super(); 
    this.expireTime = expireTime; 
    this.redisTemplate = redisTemplate; 
  } 
 
  @Override // 更新session 
  public void update(Session session) throws UnknownSessionException { 
    System.out.println("===============update================"); 
    if (session == null || session.getId() == null) { 
      return; 
    } 
    session.setTimeout(expireTime); 
    redisTemplate.opsForValue().set(session.getId(), session, expireTime, TimeUnit.MILLISECONDS); 
  } 
 
  @Override // 刪除session 
  public void delete(Session session) { 
    System.out.println("===============delete================"); 
    if (null == session) { 
      return; 
    } 
    redisTemplate.opsForValue().getOperations().delete(session.getId()); 
  } 
 
  @Override// 獲取活躍的session,可以用來統(tǒng)計在線人數(shù),如果要實現(xiàn)這個功能,可以在將session加入redis時指定一個session前綴,統(tǒng)計的時候則使用keys("session-prefix*")的方式來模糊查找redis中所有的session集合 
  public Collection<Session> getActiveSessions() { 
    System.out.println("==============getActiveSessions================="); 
    return redisTemplate.keys("*"); 
  } 
 
  @Override// 加入session 
  protected Serializable doCreate(Session session) { 
    System.out.println("===============doCreate================"); 
    Serializable sessionId = this.generateSessionId(session); 
    this.assignSessionId(session, sessionId); 
 
    redisTemplate.opsForValue().set(session.getId(), session, expireTime, TimeUnit.MILLISECONDS); 
    return sessionId; 
  } 
 
  @Override// 讀取session 
  protected Session doReadSession(Serializable sessionId) { 
    System.out.println("==============doReadSession================="); 
    if (sessionId == null) { 
      return null; 
    } 
    return (Session) redisTemplate.opsForValue().get(sessionId); 
  } 
 
  public long getExpireTime() { 
    return expireTime; 
  } 
 
  public void setExpireTime(long expireTime) { 
    this.expireTime = expireTime; 
  } 
 
  public RedisTemplate getRedisTemplate() { 
    return redisTemplate; 
  } 
 
  public void setRedisTemplate(RedisTemplate redisTemplate) { 
    this.redisTemplate = redisTemplate; 
  } 
} 

SessionDao實現(xiàn)完了之后,我們就需要將SessionDao加入SessionManager中了,代碼如下:

 @Bean 
  public DefaultWebSessionManager configWebSessionManager(){ 
    DefaultWebSessionManager manager = new DefaultWebSessionManager(); 
    manager.setCacheManager(cacheManager);// 加入緩存管理器 
    manager.setSessionDAO(sessionDao);// 設置SessionDao 
    manager.setDeleteInvalidSessions(true);// 刪除過期的session 
    manager.setGlobalSessionTimeout(sessionDao.getExpireTime());// 設置全局session超時時間 
    manager.setSessionValidationSchedulerEnabled(true);// 是否定時檢查session 
     
    return manager; 
  } 

最后一步就是將SessionManager配置到SecurityManager中了

@Bean 
  public SecurityManager securityManager(DefaultWebSessionManager webSessionManager) { 
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); 
    // 設置realm. 
    securityManager.setRealm(myShiroRealm()); 
 
    // 注入緩存管理器; 
    securityManager.setCacheManager(cacheManager);// 這個如果執(zhí)行多次,也是同樣的一個對象; 
     
    // session管理器 
    securityManager.setSessionManager(webSessionManager); 
     
    //注入記住我管理器; 
    securityManager.setRememberMeManager(rememberMeManager()); 
    return securityManager; 
  } 

測試結果如下:

==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
===============update================ 
==============doReadSession================= 
==============doReadSession================= 
===============update================ 
==============doReadSession================= 
==============doReadSession================= 
==============doReadSession================= 
權限配置-->MyShiroRealm.doGetAuthorizationInfo() 
==============doReadSession================= 

我們會發(fā)現(xiàn),當一個頁面中存在多個資源的時候,會不停的調用doReadSession,update方法來讀取和更新session,目前這個問題還沒有想到比較好的解決方案。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • RxJava的消息發(fā)送和線程切換實現(xiàn)原理

    RxJava的消息發(fā)送和線程切換實現(xiàn)原理

    這篇文章主要介紹了RxJava的消息發(fā)送和線程切換實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Java詳細分析講解自動裝箱自動拆箱與Integer緩存的使用

    Java詳細分析講解自動裝箱自動拆箱與Integer緩存的使用

    裝箱就是把基本類型轉換成包裝類,拆箱就是把包裝類轉換成基本類型,下面這篇文章主要給大家介紹Java中自動裝箱、自動拆箱與Integer緩存,需要的朋友可以參考下
    2022-04-04
  • Spring?Boot?使用?Disruptor?做內部高性能消息隊列

    Spring?Boot?使用?Disruptor?做內部高性能消息隊列

    這篇文章主要介紹了Spring?Boot?使用?Disruptor?做內部高性能消息隊列,工作中遇到項目使用Disruptor做消息隊列,對你沒看錯,不是Kafka,也不是rabbitmq。Disruptor有個最大的優(yōu)點就是快,還有一點它是開源的哦,下面做個簡單的記錄
    2022-06-06
  • springMVC利用FastJson接口返回json數(shù)據(jù)相關配置詳解

    springMVC利用FastJson接口返回json數(shù)據(jù)相關配置詳解

    本篇文章主要介紹了springMVC利用FastJson接口返回json數(shù)據(jù)相關配置詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java 微信隨機紅包算法代碼實例

    java 微信隨機紅包算法代碼實例

    這篇文章主要介紹了java 微信隨機紅包算法的相關資料,并附實例代碼,需要的朋友可以參考下
    2016-10-10
  • Java?Valhalla?Project項目介紹

    Java?Valhalla?Project項目介紹

    這篇文章主要介紹了Java?Valhalla?Project項目介紹,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java 騰訊驗證碼平臺使用實例

    Java 騰訊驗證碼平臺使用實例

    這篇文章主要介紹了Java 騰訊驗證碼平臺使用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • IDEA2023常用配置指南(JDK/系統(tǒng)設置等常用配置)

    IDEA2023常用配置指南(JDK/系統(tǒng)設置等常用配置)

    idea很強大,但是初次安裝默認的有很多設置并不是滿足我們開發(fā)的需要,下面這篇文章主要給大家介紹了關于IDEA2023常用配置(JDK/系統(tǒng)設置等常用配置)的相關資料,需要的朋友可以參考下
    2023-12-12
  • java httpclient設置超時時間和代理的方法

    java httpclient設置超時時間和代理的方法

    這篇文章主要介紹了java httpclient設置超時時間和代理的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 詳解Java?ReentrantLock可重入,可打斷,鎖超時的實現(xiàn)原理

    詳解Java?ReentrantLock可重入,可打斷,鎖超時的實現(xiàn)原理

    前面講解了ReentrantLock加鎖和解鎖的原理實現(xiàn),但是沒有闡述它的可重入、可打斷以及超時獲取鎖失敗的原理,本文就重點講解這三種情況,需要的可以了解一下
    2022-10-10

最新評論