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