Springboot和Spring Session實(shí)現(xiàn)session共享

HttpSession是通過Servlet容器創(chuàng)建和管理的责球,像Tomcat/Jetty都是保存在內(nèi)存中的吟策。而如果我們把web服務(wù)器搭建成分布式的集群纬凤,然后利用LVS或Nginx做負(fù)載均衡渔肩,那么來自同一用戶的Http請求將有可能被分發(fā)到兩個不同的web站點(diǎn)中去。那么問題就來了,如何保證不同的web站點(diǎn)能夠共享同一份session數(shù)據(jù)呢惠勒?

最簡單的想法就是把session數(shù)據(jù)保存到內(nèi)存以外的一個統(tǒng)一的地方秕衙,例如Memcached/Redis等數(shù)據(jù)庫中。

那么問題又來了掷匠,如何替換掉Servlet容器創(chuàng)建和管理HttpSession的實(shí)現(xiàn)呢滥崩?

設(shè)計一個Filter,利用HttpServletRequestWrapper讹语,實(shí)現(xiàn)自己的 getSession()方法钙皮,接管創(chuàng)建和管理Session數(shù)據(jù)的工作。spring-session就是通過這樣的思路實(shí)現(xiàn)的顽决。

使用Spring Session和Redis的組合來代替原有的HttpSession實(shí)現(xiàn)Session在不同項(xiàng)目之間的共享

在springboot中集成Spring Session

引入spring session相關(guān)依賴

<!-- spring session -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

在啟動類中配置SpringSession

@SpringBootApplication
//spring在多長時間后強(qiáng)制使redis中的session失效,默認(rèn)是1800.(單位/秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

配置類中最關(guān)鍵的就是 @EnableRedisHttpSession
@EnableRedisHttpSession 注解創(chuàng)建了一個名為 springSessionRepositoryFilterbean短条,負(fù)責(zé)替換 httpSession,同時由 redis 提供緩存支持
為了做到全部替換,我們要確保Servlet容器(Tomcat)對于某個請求都使用這個Filter,這個由SpringBoot負(fù)責(zé)
(具體是這樣的:@EnableRedisHttpSession注解通過Import才菠,引入了RedisHttpSessionConfiguration配置類茸时。該配置類通過@Bean注解,向Spring容器中注冊了一個SessionRepositoryFilter(SessionRepositoryFilter的依賴關(guān)系:SessionRepositoryFilter --> SessionRepository --> RedisTemplate --> RedisConnectionFactory赋访,有興趣可以查看源碼)
maxInactiveIntervalInSeconds:設(shè)置Session失效時間,使用Redis Session之后可都,原springbootserver.session.timeout屬性不再生效

添加驗(yàn)證的接口
yml或者properties文件中可以通過server.port設(shè)置端口

@Value("${server.port}")
    String port;

    @GetMapping("/session")
    public Object getSession(HttpServletRequest request){
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("SessionId", request.getSession().getId());
        map.put("ServerPort", "服務(wù)端口號為 "+port);
        return map;
    }

可能遇到的問題

錯誤:java.lang.NoSuchMethodError: org.springframework.data.redis.connection.RedisConnection.getConfig(Ljava/lang/String;)Ljava/util/List;
原因:出現(xiàn)這樣的錯誤應(yīng)該是引用了spring-session-data-redis1.x版本問題,改用為2.x版本即可

解決方法缓待,引用2.1.2.RELEASE版本
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>2.1.2.RELEASE</version>
</dependency>

啟動測試

訪問 http://localhost:8080/session

Paste_Image.png

我們看下redis緩存的數(shù)據(jù)
Paste_Image.png

可以發(fā)現(xiàn)sessionId已經(jīng)緩存在redis數(shù)據(jù)庫中
下面我們換個端口再訪問一次看看
這次我把端口換成了8888 訪問:http://localhost:8888/session
Paste_Image.png

刷新了redis數(shù)據(jù)庫,緩存的數(shù)據(jù)也沒變
Paste_Image.png

結(jié)果中的SessionId是一致的汹粤,卻是由兩個不同項(xiàng)目工程來提供服務(wù)命斧。這樣子,SpringSession 利用攔截器 Filter 幫我們在每個請求前進(jìn)行了同步設(shè)置嘱兼,達(dá)到了分布式系統(tǒng)中 session 共享国葬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芹壕,隨后出現(xiàn)的幾起案子汇四,更是在濱河造成了極大的恐慌,老刑警劉巖踢涌,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件通孽,死亡現(xiàn)場離奇詭異,居然都是意外死亡睁壁,警方通過查閱死者的電腦和手機(jī)背苦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潘明,“玉大人行剂,你說我怎么就攤上這事∏担” “怎么了厚宰?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遂填。 經(jīng)常有香客問我铲觉,道長,這世上最難降的妖魔是什么吓坚? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任撵幽,我火速辦了婚禮,結(jié)果婚禮上礁击,老公的妹妹穿的比我還像新娘并齐。我一直安慰自己,他們只是感情好客税,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布况褪。 她就那樣靜靜地躺著,像睡著了一般更耻。 火紅的嫁衣襯著肌膚如雪测垛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天秧均,我揣著相機(jī)與錄音食侮,去河邊找鬼号涯。 笑死,一個胖子當(dāng)著我的面吹牛锯七,可吹牛的內(nèi)容都是我干的链快。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眉尸,長吁一口氣:“原來是場噩夢啊……” “哼域蜗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起噪猾,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霉祸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后袱蜡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丝蹭,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年坪蚁,在試婚紗的時候發(fā)現(xiàn)自己被綠了奔穿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡敏晤,死狀恐怖贱田,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茵典,我是刑警寧澤湘换,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布宾舅,位于F島的核電站统阿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筹我。R本人自食惡果不足惜扶平,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔬蕊。 院中可真熱鬧结澄,春花似錦、人聲如沸岸夯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猜扮。三九已至勉吻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旅赢,已是汗流浹背齿桃。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工惑惶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人短纵。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓带污,卻偏偏與公主長得像,于是被迫代替她去往敵國和親香到。 傳聞我的和親對象是個殘疾皇子鱼冀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)养渴,斷路器雷绢,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 晚上翘紊,閑來無事,照著《唐詩三百首》里一幅插圖畫臨摹了一遍藐唠,自我感覺還是不錯的帆疟。當(dāng)然,仔細(xì)看宇立,筆法還是非常稚嫩的踪宠。畢...
    凡心志言閱讀 597評論 1 1
  • 我想你了 走在路上想打哈欠 剛張開嘴就吹來寒風(fēng) 被風(fēng)噎住的感覺 想你的時候就是這樣 無法呼吸
    壹壹不二閱讀 122評論 0 1
  • 所謂的堅(jiān)持,是在狀態(tài)好的時候繼續(xù)妈嘹。在狀態(tài)不好的時候也繼續(xù)柳琢。這就和跑步一樣。人不會總在對的狀態(tài)润脸。如果突然變得擰巴柬脸,難...
    玩兒_溫暖閱讀 155評論 0 0