多網域名稱 跨域 登入資訊共享解決方案亂彈

2021-09-06 01:28:03 字數 3692 閱讀 8973

現有需求如下:

login.nx.com

是nx.com

的二級網域名稱,

login.nx.com

是nx.com

的登入中心應用,現在有兩個拍馬屁的**

(sb.com

、sx.com)

想跟nx.com

共享登入,分享一下

nx.com

的使用者資源,現在的整合登入的目標是

: 任何一家**登入後,到其他**後都不需要再重新登入,姑且叫做良民通行證吧,

(souhu

人家也是這麼叫的)

我們都知道,要共享登入,一般情況下是需要共享應用

session

中的資訊的,而

session

儲存一般都是只在單台伺服器的記憶體中的,其他伺服器上的應用需要共享只有通過複製的方式,這是效率低下的,可以進行

session改造,

這裡不具體討論這個問題,可以參考《sna session剖析》

。通過上面一篇文章我們知道,登入相關資訊可以儲存在服務端,也可以儲存在客戶端,要和其他站點共享這些資訊,就需要解決如何在所有站點下同步這些資訊的問題,而解決同步的關鍵又在要解決跨域問題,以服務端儲存為例:

客戶端cookie

中只有sessionid

,登入相關資訊全部在服務端,通過

sessionid

在服務端即可獲取登入資訊,可以這麼理解,只要

sb.com

、sx.com

、nx.com

具有相同的

sessionid

,那麼在服務端他們就可以根據相同

sessionid

拿到登入狀態,也就共享了登入資訊,基於這個思路,解決方案有如下兩個,各有優缺點:

1、 瀏覽器訪問任何乙個未登入**都跳轉到

login.nx.com

登入中心進行登入,登入成功後設定登入狀態,並設定

cookie

儲存sessionid

,其中domain=.nx.com,

此時,nx.com

包括其子網域名稱都能成功獲取到

sessionid

,同時返回給客戶端其他需要共享登入的網域名稱列表,假設如下

(這裡除了使用

script

,其實ajax

相關的技術都可以,例如

iframe

、img, xhr,

另外注意下

p3p的問題):

這裡訪問

/pass

目的只有乙個,就是將

sessioinid

給相應的網域名稱,然後

/pass

接收到sessionid

後寫入到自己網域名稱下

cookie

中,這樣

sx.com

、sb.com

網域名稱下都有了這個

sessionid

,好,cookie

設定大功告成,然後該頁面再

redirect

到其他應該去的頁面。只要在這幾個網域名稱下,就不需要再重新登入。

優點:登入處統一設定登入相關

cookie

,集中管理,

除了第一次登入以外其他時候個系統各自為政,登入時統一重新建立

sessionid

,登出時如果

session

儲存在服務端,則直接清除服務端即可,如果儲存在客戶端,則跟登入時一樣,分別請求登出即可。

缺點:但是登入時間會有點長,如果支援網域名稱太多,這個估計有點鬱悶了,不過支援過

4-5個網域名稱問題不大,如果

session

儲存在客戶端,則登出時間也可能會稍長。 2、

瀏覽器訪問任何乙個未登入**(例如

sx.com

)都跳轉到

login.nx.com

登入中心進行登入,登入成功後設定登入狀態,並設定

cookie

儲存sessionid

,其中domain=.nx.com,

此時,nx.com

包括其子網域名稱都能成功獲取到

sessionid

,然後帶著

sessionid

引數跳轉到

分析出sessionid

後進行儲存,然後跳轉到

目標頁,此時這個頁面是登入狀態的。此時如果訪問

時,sb.com

會先檢查是否存在

sessionid,

如果不存在,則

302跳轉請求

,由於之前

login.nx.com

已經登入,此時的請求會將該網域名稱下的

cookie

中sessionid

帶到伺服器,

login.nx.com

獲取到sessionid

後,組裝成

http://sb.com/pass?sessionid=123456&redirect_url=,這個過程,與

sx.com

處理過程一致,如此就完成了登入,如果存在

sessionid

則不需要去登入中心拿

sessionid了。

優點:登入時間完全縮短,不論多少個應用都不會影響登入。

缺點:未登入也需要建立

sessionid,

因為如果沒有

sessionid

,則每個需要登入資訊的頁面

(那種登入與否都可以看的頁面

)都要去

login.nx.com

去訪問一次,這樣再

nx的也受不了這樣折騰啊,

另外,由於未登入時

sessionid

已經生成,所以使用者登入後這裡會重複利用

sessionid

,除非瀏覽器關閉。另外登出時由於要清除所有網域名稱下的

sessionid

,可能速度會有點慢,當然也可以不清除,那麼在瀏覽器關閉之前,這個

sessionid

會被重複利用,可能稍微有點安全隱患。

注:網上流傳著一種在兩個網域名稱下共享

cookie

的方案,即

a.com

,b.com

如果需要共享

cookie

,則在訪問

a.com

將cookie

設定成cookie.setdomain(『.b.com』)

,這樣b.com

就可以訪問這個

cookie

,a.com

由於是生成這個

cookie

的應用,因此也可以訪問,這就完成了共享,其實這是錯誤的,在

a.com

的網域名稱下完全不可能訪問乙個

domain=.b.com

的cookie

,既然不能基本的儲存都不可能,何來共享?各位不服氣的看官可以自己回去服務端或者

js設定一下,看設定成

domain=.126.com

後的cookie

是否儲存下來了,,然後再回來批判我,我自會刪除這段東東。

多網域名稱 跨域 登入資訊共享解決方案亂彈

現有需求如下 login.nx.com 是 nx.com 的二級網域名稱,login.nx.com 是 nx.com 的登入中心應用,現在有兩個拍馬屁的 sb.com sx.com 想跟 nx.com 共享登入,分享一下 nx.com 的使用者資源,現在的整合登入的目標是 任何一家 登入後,到其他 ...

跨域解決方案

因為瀏覽器出於安全考慮,有同源策略。也就是說,如果協議 網域名稱或者埠有乙個不同就是跨域,ajax 請求會失敗。那麼是出於什麼安全考慮才會引入這種機制呢?其實主要是用來防止 csrf 攻擊的。簡單點說,csrf 攻擊是利用使用者的登入態發起惡意請求。也就是說,沒有同源策略的情況下,a 可以被任意其他...

跨域解決方案

瀏覽器端的同源策略 如果兩個頁面的協議,埠和網域名稱中的其中任意乙個不相同,它們就是不同源的,瀏覽器會限制他們之間的資源互動 跨域 跨域的安全限制只針對瀏覽器,伺服器是沒有跨域的安全限制的 原理 由於伺服器沒有跨域限制,所以在需要跨域訪問時,在中間設定乙個中間層 舉例 192.168.10.1 80...