一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - spring boot整合redis實現shiro的分布式session共享的方法

spring boot整合redis實現shiro的分布式session共享的方法

2021-03-27 13:51牛奮lch JAVA教程

本篇文章主要介紹了spring boot整合redis實現shiro的分布式session共享的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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,可以用來統計在線人數,如果要實現這個功能,可以在將session加入redis時指定一個session前綴,統計的時候則使用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實現完了之后,我們就需要將SessionDao加入SessionManager中了,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
@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中了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Bean
  public SecurityManager securityManager(DefaultWebSessionManager webSessionManager) {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    // 設置realm.
    securityManager.setRealm(myShiroRealm());
 
    // 注入緩存管理器;
    securityManager.setCacheManager(cacheManager);// 這個如果執行多次,也是同樣的一個對象;
     
    // 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================= 

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

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

原文鏈接:http://blog.csdn.net/liuchuanhong1/article/details/76690682

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品国产专区91在线 | 特级淫片大乳女子高清视频 | 国内精品久久久久影院嫩草 | 青青草国产精品 | 96日本xxxxxxxxx70 95在线观看精品视频 | 亲爱的客栈第二季免费观看完整版 | 免费视频亚洲 | 肉搏潘金莲三级18春 | www视频免费观看 | 国产小视频在线播放 | 国产精品久久久久久久久久久久久久 | 国语精彩对白2021 | 国产91在线九色 | 久久久影院亚洲精品 | 赤色疑惑| 私人黄色影院 | 国产精品免费久久久久影院 | 91精品天美精东蜜桃传媒免费 | 午夜视频一区二区 | 好姑娘完整版在线观看中文 | 51国产午夜精品免费视频 | 星空无限传媒xk8027穆娜 | 好大好湿好硬好爽好深免费视频 | 国内精品久久久久影院男同志 | 亚洲va久久久噜噜噜久久狠狠 | 欧美办公室silkstocking | 高清国产欧美一v精品 | 精品免费视在线视频观看 | 调教禽兽 | 日比免费视频 | 亚洲AV人无码综合在线观看蜜桃 | juliaann主妇疯狂| 四缺一的小说 | 99久久久无码国产精品 | 1919gogo女厕盗摄 | 午夜福利理论片在线播放 | 色伦网| 99免费在线视频 | 欧美深夜在线 | 欧美特级特黄a大片免费 | 成人毛片高清视频观看 |