session跨域共享問題解決方案


在討論 session 跨域共享問題之前,我們首先要了解 session 做了什么,沒做什么

1.HTTP無狀態的,也就是說服務器不知道誰訪問過他,但是有時間,又需要我們去保留這個狀態比如說用戶的登錄信息,如果每次訪問都要登錄,這個用戶體驗實在是太糟糕了,session 就解決了這個問題,他把用戶登錄信息維護在服務端,會生成一個JSessionID給客戶端,客戶端下次訪問的時候就帶着這個JSessionID,服務端根據這個IP去查找用戶信息。

2.當然,session 的缺點也很明顯,session 是存在服務器的內存中的,如果 session 過多會影響服務器的性能。因為 session 只在一台服務器里,當有多台服務器的時候,訪問別的服務器肯定會失敗。

 

明確了 session所做的事以及它的缺陷之后,解決 session 存在的問題就容易多了,下面我簡要說一下5種解決方案

  • Session Sticky
  • Session復制
  • Session集中存儲
  • Cookie
  • Token

Session Sticky:是指讓同一客戶端的請求,落在同一台服務器上,因為不會落在別的服務器上,所以自然就不會出現跨域問題。但是這個方案的缺點也是非常明顯的。就是不管比采用什么算法,用戶的請求落在那一台服務器上都是由用戶來決定的,可能會造成單點壓力,並且如果一台服務器出問題,可能會造成一片區域的人無法訪問

Session復制:是指服務器之間互相同步session信息,也就是說每台服務器上都保存着所有的session信息。這樣做的缺點也是非常明顯的。上文提到過,session 是存在內存中的,會嚴重影響服務器性能,當然,你也可以把他存在數據庫中,但是這會大大影響響應速度。還有一個缺點就是,當訪問量過大時,由於相互同步的問題,會造成大量的網絡開銷

Session 集中存儲,是指把 session 集中存儲在一個第三方的服務器中,可以是 Redis,可以是數據庫或是其他什么東西。當需要訪問的時候,都去這個服務器去查。這樣做也有不小的缺點,首先是單點問題,如果這個服務器宕機,那么所有的服務器都是不可用的,所以這里必須做集群,會浪費服務器資源。還有一點是,每次驗證都需要來這個服務器來查,會憑白增加一次網絡開銷,降低訪問速度

 

Cookie:狀態信息不再保存在服務端,而是保存在客戶端,客戶端每次訪問服務器的時候,把這個信息帶給服務器。但是 Cookie 也有不少問題,最被人關注的就是安全問題,因為信息是保存在客戶端的,就比較容易盜取、篡改,當然這些安全問題都是有解決方案的,這不是限制 Cookie 的主要原因,真正限制 Cookie 的原因是很多設備不支持Cookie

 

Token 和 Cookie 類似,Token 也是由客戶端來維持狀態的,信息存儲在客戶端內,具有平台無關性。Token實質上是服務端給客戶端的一個字符串,上面包含着一些驗證信息,相當於一個身份令牌,你拿着這個令牌就能得到他的服務。相比較於 Cookie,Token 更加的靈活,可以在任何地方生成,基於 Token 的權限系統是非常容易實現的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM