Spring session實(shí)現(xiàn)Session共享
Redis session
用戶第一次訪問(wèn)應(yīng)用,會(huì)創(chuàng)建一個(gè)新的Session,并且會(huì)將Session的ID作為Cookie緩存在瀏覽器。下一次訪問(wèn)請(qǐng)求時(shí),請(qǐng)求的頭部會(huì)帶有Cookie。應(yīng)用通過(guò)Session ID進(jìn)行查找。如果Session存在并且有效,就會(huì)繼續(xù)請(qǐng)求。
為什么使用session共享:
如果沒(méi)有Session共享,session的信息放在內(nèi)存中,如果Tomcat關(guān)閉,內(nèi)存中的Session就會(huì)銷(xiāo)毀。在多實(shí)例(多個(gè)Tomcat)中無(wú)法共享,導(dǎo)致一個(gè)用戶只能訪問(wèn)一個(gè)實(shí)例。
在實(shí)現(xiàn)共享后,只要Cookie中的Session ID 無(wú)法改變,多實(shí)例的任意一個(gè)被銷(xiāo)毀,都不會(huì)影響用戶訪問(wèn)。
- 有了session共享,即使服務(wù)器重啟也不需要重新登錄。
- 假設(shè)某個(gè)網(wǎng)站是由多臺(tái)服務(wù)器提供服務(wù),nginx采用輪詢(xún)機(jī)制做負(fù)載均衡,那么同一個(gè)IP訪問(wèn)該網(wǎng)站時(shí),請(qǐng)求就可能會(huì)被分配到不同的服務(wù)器上,如果 session 沒(méi)有 實(shí)現(xiàn)共享 ,就會(huì)出現(xiàn)重復(fù)登陸授權(quán)的情況。
- 注意,瀏覽器不能關(guān)閉,因?yàn)闉g覽器的cookie是會(huì)話級(jí)別的,瀏覽器關(guān)閉就會(huì)失效。
session 共享原理:
當(dāng)請(qǐng)求進(jìn)來(lái)的時(shí)候,SessionRepositoryFilter 會(huì)先攔截到請(qǐng)求,將 request 和 response 對(duì)象轉(zhuǎn)換成 SessionRepositoryRequestWrapper 和 SessionRepositoryResponseWrapper 。后續(xù)當(dāng)?shù)谝淮握{(diào)用 request 的getSession方法時(shí),會(huì)調(diào)用SessionRepositoryRequestWrapper 的getSession方法。這個(gè)方法是被重寫(xiě)過(guò)的,邏輯是先從 request 的屬性中查找,如果找不到;再查找一個(gè)key值是"SESSION"的 Cookie,通過(guò)這個(gè) Cookie 拿到 SessionId 去 Redis 中查找,如果查不到,就直接創(chuàng)建一個(gè)RedisSession 對(duì)象,同步到 Redis 中。
說(shuō)的簡(jiǎn)單點(diǎn)就是:攔截請(qǐng)求,將之前在服務(wù)器內(nèi)存中進(jìn)行 Session 創(chuàng)建銷(xiāo)毀的動(dòng)作,改成在 Redis 中創(chuàng)建。
Spring Session提供了一套創(chuàng)建和管理Servlet HTTPSession的方案,Spring Session提供了集群Session功能,默認(rèn)采用外置的Redis來(lái)存儲(chǔ)Session數(shù)據(jù),以此來(lái)解決Session共享問(wèn)題。
使用過(guò)濾器攔截請(qǐng)求
<!-- spring session共享filter -->
<!-- 該過(guò)濾器必須是第一個(gè)過(guò)濾器,所有的請(qǐng)求經(jīng)過(guò)該過(guò)濾器后執(zhí)行后續(xù)操作 -->
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置Redis
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ? ? ? ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ? ? ? ?xsi:schemaLocation="http://www.springframework.org/schema/beans ? ? ? ? ? ? ? ? ? ? ? ? ?http://www.springframework.org/schema/beans/spring-beans.xsd"> ? ? <!--Jedis連接池的相關(guān)配置--> ? ? <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> ? ? ? ? <!--最大連接數(shù), 默認(rèn)8個(gè)--> ? ? ? ? <property name="maxTotal" value="100"></property> ? ? ? ? <!--最大空閑連接數(shù), 默認(rèn)8個(gè)--> ? ? ? ? <property name="maxIdle" value="50"></property> ? ? ? ? <!--允許借調(diào) 在獲取連接的時(shí)候檢查有效性, 默認(rèn)false--> ? ? ? ? <property name="testOnBorrow" value="true"/> ? ? ? ? <!--允許歸還 在return給pool時(shí),是否提前進(jìn)行validate操作--> ? ? ? ? <property name="testOnReturn" value="true"/> ? ? </bean> ? ? <!--配置JedisConnectionFactory--> ? ? <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> ? ? ? ? <property name="hostName" value="192.168.175.100"/> ? ? ? ? <property name="port" value="6379"/> ? ? ? ? <property name="database" value="0"/> ? ? ? ? <property name="poolConfig" ref="jedisPoolConfig"/> ? ? </bean> ? ? <!-- 配置session共享 --> ? ? <bean id="redisHttpSessionConfiguration" ? ? ? ? ? class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"> ? ? ? ? <property name="maxInactiveIntervalInSeconds" value="600" /> ? ? </bean> </beans>
到此這篇關(guān)于Spring session實(shí)現(xiàn)Session共享的文章就介紹到這了,更多相關(guān)Spring session 共享內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- spring boot整合redis實(shí)現(xiàn)shiro的分布式session共享的方法
- SpringBoot2.x 整合Spring-Session實(shí)現(xiàn)Session共享功能
- 詳解springboot中redis的使用和分布式session共享問(wèn)題
- 利用Spring Session和redis對(duì)Session進(jìn)行共享詳解
- Springboot實(shí)現(xiàn)多服務(wù)器session共享
- Spring整合redis(jedis)實(shí)現(xiàn)Session共享的過(guò)程
- Spring boot集成spring session實(shí)現(xiàn)session共享的方法
- SpringSession+Redis實(shí)現(xiàn)集群會(huì)話共享的方法
- 基于SpringBoot+Redis的Session共享與單點(diǎn)登錄詳解
- spring boot與redis 實(shí)現(xiàn)session共享教程
- SpringBoot中實(shí)現(xiàn)分布式的Session共享的詳細(xì)教程
相關(guān)文章
Java編程實(shí)現(xiàn)鄰接矩陣表示稠密圖代碼示例
這篇文章主要介紹了Java編程實(shí)現(xiàn)鄰接矩陣表示稠密圖代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
spring?security?自定義Provider?如何實(shí)現(xiàn)多種認(rèn)證
這篇文章主要介紹了spring?security?自定義Provider實(shí)現(xiàn)多種認(rèn)證方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot接口返回的數(shù)據(jù)時(shí)間與實(shí)際相差8小時(shí)問(wèn)題排查方式
文章描述了在部署SpringBoot應(yīng)用到容器中時(shí)遇到請(qǐng)求接口返回時(shí)間與實(shí)際相差8小時(shí)的問(wèn)題,并詳細(xì)分析了可能的原因及具體的排查步驟和解決方案,總結(jié)指出,環(huán)境初始時(shí)區(qū)未配置是根本原因,建議在應(yīng)用部署前配置好時(shí)區(qū)2025-02-02
SpringBoot JSON全局日期格式轉(zhuǎn)換器實(shí)現(xiàn)方式
這篇文章主要介紹了SpringBoot JSON全局日期格式轉(zhuǎn)換器,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
java web中圖片驗(yàn)證碼功能的簡(jiǎn)單實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇java web 驗(yàn)證碼的簡(jiǎn)單實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖
這篇文章主要為大家詳細(xì)介紹了JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

