Redis入門-4-Redis實現session共享

目錄

一、什麼是session共享

二、實現session共享的幾種方式及一些對比

三、用redis實現session共享

四、瀏覽器和服務器之間的session是怎麼對應上的

五、springboot中是如何整合session共享的

六、題外-jdbc實現session共享


一、什麼是session共享

由於web應用請求後臺是用的http協議,http是無狀態的協議,在服務端就需要使用session來保存一些與會話相關的內容,例如登錄信息等。當用戶登錄了系統之後,用戶攜帶瀏覽器的cookie來請求,我們便根據cookie獲取對應的服務器存入的session信息,這樣就實現了服務端對用戶的認證。

但是,當我們有多臺服務器時怎麼辦?如果還是使用原來的的方式,session存到服務器上,用戶的請求並不是一定會落到已經認證的服務器上,如果請求到了未存到對應session的服務器上,用戶還是要進行一次認證,這樣的結果肯定不是我們想要的。

session共享就是劃分出一個公共區域,讓服務器都能夠拿到需要的session信息,這樣就不會出現用戶的請求需要重複認證的情況。

二、實現session共享的幾種方式及一些對比

session共享方式對比
實現方式 優點 缺點
Redis實現

1、支持持久化

2、支持集羣

3、內存數據庫,讀寫快

需要單獨再維護個redis服務器
JDBC實現

1、方便,直接使用數據庫來存儲session信息

1、由於session的存取都是依賴數據庫,會加多很多的數據庫的請求,數據量多了對整體的請求速度應該都會有影響。

2、如果使用hibernate,由於session訪問的也是連接數據庫的,數據庫的session釋放會在最外層,會導致在controller層獲取的POJO對象處於持久態。

Memcache

1、快速,數據存入內存

 

1、不支持持久化,如果宕機了會導致session信息丟失

三、用redis實現session共享

1、引入依賴

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

2、添加配置

添加配置有兩種方式

(1)在RedisConfig.java裏面添加註解

可以設置session的過期時間(單位是秒):@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)

(2)在application.properties中添加spring.session.store-type=redis

四、瀏覽器和服務器之間的session是怎麼對應上的

1、瀏覽器的cookies裏帶的session的value進行base64解碼之後,就是redis裏的session的key值

redis裏面的值

瀏覽器裏面的值

如果session過期之後,redis會是過期session

五、springboot中是如何整合session共享的

源碼沒有看完,這裏大致講一下官方文檔的翻譯,

1、spring會創建一個叫springSessionRepositoryFilter的過濾器,這個過濾器會管理替換了HttpSession實現的Spring Session,spring session的信息會存入redis

2、創建了一個RedisConnectionFactory來連接redis

3、當然,還對httpRequest和httpResponse都進行了包裝,讓這些對象能攜帶新的session信息。

具體的實現方式後續再跟進源碼分析。

六、題外-jdbc實現session共享

1、依賴

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-jdbc</artifactId>
</dependency>

2、配置

在配置文件中添加:spring.session.store-type=jdbc

jdbc實現session共享支持指定datasource,在jdbc的配置類裏面注入事先定義好的數據源,再加上@SpringSessionDataSource註解就可以。

3、問題

添加了jdbc實現session共享之後,如果有session信息,controller獲取到的POJO類會是持久態的,未添加session共享之前是遊離態的對象。

 

後記,其實如果作爲前後端分離開發的話,應該使用基於token的方式來進行驗證,因爲其實app這些不同於web瀏覽器,並沒有cookie,而是需要使用token來保證認證信息的。

嗯,這又是單點登錄和token驗證的內容了,後面有機會再學習分享一下。以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章