目錄
一、什麼是session共享
由於web應用請求後臺是用的http協議,http是無狀態的協議,在服務端就需要使用session來保存一些與會話相關的內容,例如登錄信息等。當用戶登錄了系統之後,用戶攜帶瀏覽器的cookie來請求,我們便根據cookie獲取對應的服務器存入的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驗證的內容了,後面有機會再學習分享一下。以上。