Session跨域及單點登入解決方案

2021-08-28 02:14:17 字數 2915 閱讀 3801

cookie機制

關於cookie和seesion的聯絡

cookie中會包含那些資訊

名字,值,過期時間,路徑,域

cookie會帶到http請求頭中傳送給服務端

如果cookie沒有設定過期時間的話,那麼cookie的預設生命週期是瀏覽器的會話

session機制

1,session是容器物件,客戶端在請求服務端的時候,服務端會根據客戶端的請求判斷是否包含了jsessionid的標識

2,如果已經包含了,說明客戶端之前已經建立了會話。sessionid是乙個唯一的值

3,如果sessionid不存在,那麼服務端為這個客戶端生成乙個sessionid. jessionid

sessioncookie儲存的是jsessionid  

session儲存在伺服器端  cookie儲存在瀏覽器端

伺服器端(tomcat)會生成乙個唯一的sessionid號儲存在cookie中 叫 jessionid

在伺服器端(tomcat)中儲存serssion 使用concurrentmap (concurrentmap   key jsessionid  values session)

瀏覽器端下次請求伺服器端是將jsessionid帶過來 找到對應的session 獲取session中儲存的資訊(使用者資訊)

客戶端瀏 覽器禁用了cookie怎麼辦?

[如果客戶端瀏 覽器禁用了cookie,一般會通過url重寫的方式來進行會 話會話嗯個總,也就是在url中攜帶sessionid] 

解決session跨域共享問題

1.session sticky  :會話儲存在單機上  保證會話請求落在同一臺伺服器上

採用源位址雜湊法進行負載均衡,同一ip位址的客戶端,當後端伺服器列 表不變時,它每次都會對映到同一台後端伺服器進行訪問

根據獲取客戶端的ip位址,通過雜湊函式計算得到的乙個 數值,用該數值對伺服器列表的大小進行取模運算,得到的結果便是客服端要訪問伺服器的序號。採用源位址雜湊 法進行負載均衡,同一ip位址的客戶端,當後端伺服器列表不變時,它每次都會對映到同一台後端伺服器進行訪問

這種實現方式會有些問題:  如果一台web伺服器宕機或者重啟,那麼這台機器上保 存的會話資料都會丟失,會造成使用者暫時無法訪問的問 題,或者使用者之前的授權操作需要再執行一次 

2.session replication:session 複製  每一台伺服器上都保持乙份相同的session (造成額外的儲存開銷和網路開銷)

session複製,通過相關技術實現session複製,使得集群 中的各個伺服器相互儲存各自節點儲存的 session 資料。 tomcat本身就可以實現session複製的功能,基於ip組播 放方式。

這種實現方式的問題:

1. 同步session資料會造成網路開銷,隨著集群規模越大, 同步session帶來的頻寬影響也越大

2. 每個節點需要儲存集群中所有節點的 session 資料,就 需要比較大的記憶體來儲存。

3.session 集中儲存  :儲存在db、 儲存在快取伺服器 (redis)

使用 spring-session -data-redis

4. 基於cookie (主流)

a)

access_token(userid/token/timestamp(過期時間)   加密)

將access_token儲存在客戶端的cookie中 每次 客戶端過來訪問 伺服器端攔截其中 獲取cookie中的access_token 根據 userid和timestamp(過期時間) 判斷是否有效

b)基於jwt的解決方案

json web token  客戶端和服務端資訊保安傳遞,身份認證的一種解決方案。用在登陸上

jwt由三個組成:header,payload 載荷,signature

header

public static mapvarifytoken(string token)catch (exception e)

return jwt.getclaims();

}public static long gettokeninfo(string token)

return long.valueof(user_id_claim.asstring());

}}(1)簡單的說,token只是乙個標識,以token加redis為例,服務端將token儲存在redis中,客服端訪問時帶上token,如果在redis中能夠查到這個token,說明身份有效。

(2)jwt不需要查庫,本身已經包含了使用者的相關資訊,可以直接通過服務端解析出相關的資訊,與session,token的最大區別就是服務端不儲存任何資訊(服務端只需要儲存金鑰key)。

在jwt中儲存過期時間,解析時進行判定,如果即將超時則重新設定過期時間返回乙個新的jwt給客戶端。

登出時將相關的資訊比如使用者名稱儲存在redis中,並設定過期時間。當再次訪問時,從jwt中解析出使用者名稱去redis中查詢,如果存在則表示此jwt已登出失效。這裡需要注意的是,如果用此方法,則驗證jwt是否登出應該放在第一位。思考乙個場景,如果redis中儲存的是使用者名稱,那麼當使用者登出後,redis中已經有了相應的使用者名稱,當使用者再次登入時,解析jwt發現此使用者已登出,則jwt失效,所以在登入時要清空相關的登出快取。

參考文件

jwt demo **: 

SSO C 跨域單點登入 二

開始新建乙個站點sitea,同時引用 前面建的web服務 建立basepage.cs類 頁面基類 public class basepage page 登入站點a user.username else else base.onload e 建立乙個default.aspx頁面 開始新建乙個站點sit...

cas跨域單點登入原理

相同網域名稱下實現單點登入太簡單,因為a系統和b系統網域名稱相同,在訪問a時候登入過,在訪問b時,由於網域名稱相同,瀏覽器會帶上cookies,cookies裡有票據資訊,訪問b自然就不用再登入了。可是如果a系統和b系統網域名稱不同,cas是怎樣做到已經在訪問a系統時候登入過,在訪問b系統時就不用再...

跨域 Cookie 實現單點登入

單點登入 sso single sign on 對於同乙個客戶端 例如 chrome 瀏覽器 只要登入了乙個子站 例如 a.com 則所有子站 b.com c.com 都認為已經登入。比如使用者在登入 後,跳轉到天貓時就已經登入了。未登入使用者訪問子站 a.com 進行登入,自動跳轉到賬戶中心的統一...