這些SpringBoot會話保持方案你都用過哪些?

一般來說,比較常用的方案有兩種:Session與JWT

Session-Cookie

這種會話方式我們需要區分為傳統單機Session與分散式Session。

在傳統單機Web應用中,一般使用Tomcat、Jetty等Web容器時,使用者的Session都是由容器(單JVM內有效)管理。瀏覽器使用Cookie中記錄SessionId,容器根據 SessionId判斷使用者是否存在會話Session。分散式與叢集場景下,請求將被負載傳送至不同伺服器,所以在這種場景下就要對Session做共享處理了。

傳統Session儲存架構:

這些SpringBoot會話保持方案你都用過哪些?

傳統Session儲存架構圖

分散式Session儲存架構:

會話資訊儲存在伺服器端Session物件當中,這種方式在分散式會話場景下比較繁瑣,一般我們用SpringSession做分散式會話,會話資訊一般會選擇第三方中介軟體進行儲存,比如:MongoDB,Redis,Mysql,這三種儲存方式分散式會話框架SpringSession都支援,並提供SpringBoot的整合,我們只需要做相關配置即可。以Redis作為分散式Session儲存服務為例:

<!——第一步:引入依賴——><!——第一步:引入依賴——><!‐‐sessions 依賴‐‐> org。springframework。session spring‐session‐data‐redis 2。0。6。RELEASE<!‐‐redis 依賴‐‐> org。springframework。boot spring‐boot‐starter‐data‐redis 2。0。6。RELEASE

<!——第二步:在application。yml配置Redis與Session——>spring: redis: host: 192。168。0。198 port: 6379 session: store‐type: redis

分散式會話搞定,就是這麼簡單!!

這些SpringBoot會話保持方案你都用過哪些?

分散式Session儲存架構圖

JWT

全稱JSON Web Token,

使用者會話資訊儲存在客戶端瀏覽器,

它定義了一種緊湊且自包含的方式,用於在各方之間以JSON物件進行安全傳輸資訊。這些資訊可以透過對稱或非對稱方式進行簽名,防止資訊被串改。

由此可知JWT是:

是JSON格式的資料;

是一個Token,也就是一個令牌方式;

JWT資料包含三部分:

Header

Payload

Signature

示例:

組合方式:Header。Payload。SignatureeyJhbGciOiJIUzUxMiJ9。eyJzdWIiOiJ0ZXN0IiwiY3JlYXRlZCI6MTU3NzE3NjE0OTQ3OCwiZX hwIjoxNTc3NzgwOTQ5fQ。qSlhJNpom2XeeqMyXST2AdHvAjztWqR4zvQQEc‐K8qMsJ3XQpwpQsnG7tK06YoYrjcnH5NW2EGjtemIc_00VIwHeader:描JWT元資料{ alg: “HS256”, // 表示簽名的演算法,預設演算法為HS256,可以自行別的演算法。 type: “JWT” // 表示這個令牌的型別,JWT令牌就為JWT。}Header = Base64(上方的json資料)Payload:{ “userId”: “lan”, // 使用者ID “exp”: 1489079981393 // 最近更新時間}Payload = Base64(上方的json資料)Signature = HMACSHA256( base64UrlEncode(Header) + “。” + base64UrlEncode(Payload),secret)// secret為加密的金鑰,金鑰存在服務端

JWT使用方式:

通常我們把Token設定在Request‐Header頭中,每次請求前都在請求頭加上下方配置

Authorization: Bearer

示例:Bearer eyJhbGciOiJIUzUxMiJ9。eyJzdWIiOiJ0ZXN0IiwiY3JlYXRlZCI6MTU3NzE3NjE0OTQ3OCwiZXhwIjoxNTc3NzgwOTQ5fQ。qSlhJNpom2XeeqMyXST2AdHvAjztWqR4zvQQEc‐K8qMsJ3XQpwpQsnG7tK06YoYrjcnH5NW2EGjtemIc_00VIw

JWT身份認證流程:

使用者提供使用者名稱和密碼登入

伺服器校驗使用者是否正確,如正確,返回Token給客戶端,此Token可以包含使用者資訊

客戶端儲存Token,可以儲存在Cookie或Local Storage中

客戶端再次請求時,在請求頭中帶上這個Token

伺服器判斷是否存在Token,並且解碼後可以知道是哪個使用者

這些SpringBoot會話保持方案你都用過哪些?

JWT身份認證流程圖