Spring?Session(分布式Session共享)實現示例
HttpSession的實現流程
1.當用戶訪問服務器端時,服務器端會判斷請求是否攜帶包含JSESSIONID的Cookie。
如果沒有攜帶,服務器端會創(chuàng)建一個Cookie,key為JSESSIONID,value是長字符串(唯一字符串)。
同時會實例化一個Session對象。把Session對象放入到全局Map中,Map的key是Cookie的value,Map的value就是Session對象。
同時設置Session對象屬性的值,記錄creationTime創(chuàng)建實現、id是JSESSIONID對應值、lastAccessedTime最后一次訪問時間、maxInactiveInterval 最大存活時間
2.服務器響應給客戶端結果,響應對象中包含Cookie內容,Cookie就會存儲在客戶端。
3.客戶端再次請求服務器端時會自動攜帶Cookie內容。
4.服務器端再次接收請求后發(fā)現請求中Cookie帶有JSESSIONID,根據JSESSIONID的值進行從Map中取出Session對象,會判斷l(xiāng)astAccessedTime和maxActiveInterval屬性,判斷Session是否失效,如果失效執(zhí)行a)步驟重新創(chuàng)建Session對象。
如果沒有失效修改lastAccessedTime為當前訪問時間。
Tomcat中的HttpSession實現
當向Session作用域存儲值時執(zhí)行上面Session原理,把Session對象取出后,Session作用域的值就存儲在全局Map屬性(此Map屬性是Session對象的全局屬性) ?
既然HttpSession存儲值時是一個全局Map,所以依然可以使用Redis這種鍵值對NoSQL數據庫來替代這個Map,也就是存自定義實現時用Redis存儲以前放在Session中值。
使用
導入依賴
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
編輯配置文件
server: port: 8000 spring: redis: host: 192.168.8.128
編輯啟動類
/** * EnableRedisHttpSession - 讓Spring Session分布式會話共享技術生效。 */ @SpringBootApplication @EnableRedisHttpSession public class Web1App{ public static void main(String[] args){ SpringApplication.run(Web1App.class, args); } }
編輯控制器
@RestController public class Web1Controller { @RequestMapping("/set") public String demo(HttpSession session, String attName, String attValue){ session.setAttribute(attName, attValue); return "WEB1工程:已設置' " + attName + " = " + attValue + " '到會話變量作用域"; } @RequestMapping("/get") public String demo(HttpSession session, String attName){ Object attValue = session.getAttribute(attName); System.out.println("從會話中獲取" + attName + "變量,值是:" + attValue); return "WEB1工程:從會話中獲取" + attName + "變量,值是:" + attValue; } }
@EnableRedisHttpSession注解屬性
@SpringBootApplication @EnableRedisHttpSession(redisNamespace = "bjsxt:session", maxInactiveIntervalInSeconds = 3600, flushMode = FlushMode.ON_SAVE, saveMode = SaveMode.ON_SET_ATTRIBUTE, cleanupCron = "0 * * * * *" ) public class Web1App { public static void main(String[] args) { SpringApplication.run(Web1App.class, args); } }
redisNamespace
保存在redis中的數據的key前綴。默認spring:session。
maxInactiveIntervalInSeconds
會話生命周期。默認1800秒。
flushMode
刷新redis數據的模式。默認ON_SAvE。在保存時才刷新。另一個取值FlushMode.IMMEDIATE,不刷新。
saveMode
保存模式。默認值SaveMode.ON_SET_ATTRIBUTE:在設置session屬性時保存??蛇x值如下:
- SaveMode.ALWAYS:實時保存。
- SaveMode.ON_GET_ATTRIBUTE:獲取值時才進行保存到Redis。
cleanupCron
清除Redis中數據的表達式。默認”0 * * * * *”
Spring Session保存在Redis中的數據
spring:session:sessions:唯一值
value的類型是Hash類型。表示整個Session對象。包括:
- creationTime :創(chuàng)建會話的時間
- lastAccessedTime :最后一次訪問時間
- maxInactiveInterval :有效生命周期,默認30分鐘
- sessionAttr:xxx :會話中的attribute值。field中的xxx代表會話中attribute的名字,會話中每個attribute,對應一個field-value對。
spring:session:sessions:expires:唯一值
value的類型是String類型。沒有什么特殊內容。表示當前session過期狀態(tài)。如果沒有該屬性說明,當前Session已過期。
spring:session:erxpirations:時間戳
value的類型是Set類型。里面存儲了這個時間戳是哪個session的。如果過期了,該鍵值對也會被刪除掉。
基于Header的Spring Session或改變Cookie名稱
修改Cookie名稱
添加配置類修改Spring Session 中的Cookie名稱。
@Configuration public class MyConfiguration { @Bean public HttpSessionIdResolver httpSessionIdResolver(){ // 創(chuàng)建cookie轉換器 CookieHttpSessionIdResolver httpSessionIdResolver = new CookieHttpSessionIdResolver(); // 設置Cookie序列化方案 DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer(); // 設置Cookie的名字 cookieSerializer.setCookieName("BJSXT"); httpSessionIdResolver.setCookieSerializer(cookieSerializer); return httpSessionIdResolver; } }
設置Header
添加配置類修改Spring Session 是基于Header指定名稱請求頭,代替Cookie。
@Configuration public class MyConfiguration { @Bean public HttpSessionIdResolver httpSessionIdResolver(){ HttpSessionIdResolver httpSessionIdResolver = new HeaderHttpSessionIdResolver("MY-SESSION"); return httpSessionIdResolver; } }
到此這篇關于Spring Session(分布式Session共享)實現示例的文章就介紹到這了,更多相關Spring Session(分布式Session共享)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- springboot普通類中如何獲取session問題
- SpringBoot3整合MyBatis出現異常:Property?'sqlSessionFactory'or?'sqlSessionTemplate'?are?required
- SpringBoot集成redis與session實現分布式單點登錄
- SpringBoot Session接口驗證實現流程詳解
- SpringBoot整合SpringSession實現分布式登錄詳情
- SpringBoot?整合?Spring-Session?實現分布式會話項目實戰(zhàn)
- 詳解SpringBoot中@SessionAttributes的使用
- SpringBoot中HttpSessionListener的簡單使用方式
- SpringBoot2.x設置Session失效時間及失效跳轉方式
- SpringBoot下實現session保持方式
相關文章
JAVA代碼設置selector不同狀態(tài)下的背景顏色
這篇文章主要介紹了JAVA代碼設置selector不同狀態(tài)下的背景顏色,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-05-05深度deepin安裝以及jdk、tomcat、Nginx安裝教程
這篇文章主要給大家介紹了關于深度deepin安裝以及jdk、tomcat、Nginx安裝的相關資料,按照文中介紹的方法可以輕松的實現安裝,對大家的工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01springboot 高版本后繼續(xù)使用log4j的完美解決方法
這篇文章主要介紹了 springboot 高版本后繼續(xù)使用log4j的解決方法,需要的朋友可以參考下2017-12-12Maven發(fā)布項目 (jar包) 到Nexus私服中的操作
這篇文章主要介紹了Maven發(fā)布項目 (jar包) 到Nexus私服中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10學習Java之自定義異常與NullPointerException的處理
有時候Java自身提供的異常類并不能很好地表達我們的需求,所以這時候我們就可以自定義異常,也就是說,我們可以制造出一個自己的異常類,這樣就可以拋出或捕獲自己的異常了,本文就給大家詳細講講Java自定義異常與NullPointerException的處理2023-08-08