shiro框架---关于多项目之间验证为什么需要共享session
關于多項目之間登錄驗證為什么需要共享session
服務器上部署了兩個項目,登錄之后才可以訪問其中的接口。現在想要實現,當登錄項目1成功后,可以不需要再登錄項目2,直接可以訪問項目2中的接口。
大部分人都會想到,共享session ,但是為什么是共享session 呢?
一、為什么需要共享session
以shiro 框架作為登錄驗證權限框架 為例,這里還不寫這個,先說為什么需要共享session ,正常情況的時候,是如下圖:
如上圖描述,每個項目中shiro 都維護了自己的sessionid與session的關系 ,它們之間不共享。
上圖兩個項目中切換請求必然會有如下的步驟:
1、sessionId串的生成
瀏覽器首次對項目1發起請求時,項目1 會為當前請求創建一個session ,根據session 生成一個sessionId 字符串,該sessionId串 與創建的session 維護著一個關聯關系。
2、sessionId串存到cookie中
后臺將該sessionId串返回給瀏覽器,瀏覽器將sessionId串 拿到后,存儲到瀏覽器中的cookie 中。如下圖:
3、再去請求項目2
當然,當前的這個sessionId串 僅僅對項目1 來說是認識的。如果這時候瀏覽器接著訪問項目2,(在http請求中,發起請求的一方總會把自身所帶的所有cookie 打包到請求頭中傳給服務)。如下邊兩張圖所示:
第一張為在去請求項目2前,可以看到瀏覽器中的cookie ,此時共有三個,其中sessionId 對應的字符串是來自于項目1 登錄成功后返回的 :
當我對項目2 發起請求,瀏覽器將現有的所有cookie 串統統放到了request headers 里,傳了過去。
4、請求必然失敗
這時候項目2 中已有的session 集合中無法根據當前傳入進來的sessionId串 匹配成功的。因此登錄不成功。
問題就看出來,是因為項目2 里的session 集合無法認識當前傳入進來的sessionId ,匹配不到session 導致的訪問失敗。
二、共享session 后的邏輯
上邊已大致說明為什么需要共享session 。那共享session 后,是什么邏輯,也備了一張圖,下邊的共享項目我已經共享到GitHub 中了。
先來說一下我的理解 ,如下:
上圖中master 項目為主項目,登錄頁即在這個項目中,suiteone 、suitetwo 為兩個從項目,當兩個從項目有請求時,如果沒有登錄的時候,都會打到master 項目的登錄頁上。共享session 采用的是redis 存儲。
上圖的步驟如下:
以上描述的并不難,大家也都會想到,那么如何將扯了這么多的淡 真正更簡單的,落地實現才是大家關注的。
如果想了解具體shiro中如何實現的共享session ,可以參考下邊的鏈接
[shiro框架—多項目登錄訪問共享session的實現]
總結
以上是生活随笔為你收集整理的shiro框架---关于多项目之间验证为什么需要共享session的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java接口修饰符详解
- 下一篇: 第四范式入选Gartner 2020十大