回複內容:
你給我私信裡說網域名稱不是簡單父子網域名稱的關係,所以直接的cookie共用是不可行的。提供一種比較好做的方案,假設你有三個不同網域名稱,a.com, b.com, http://c.com
,將其中之一作為真正的登陸入口,所有的網域名稱下發起的登陸,全部重新導向到這個節點,這裡假設選擇http://a.com/login.php
為統一登入節點,為了方便說明,把http://a.com
叫做主節點,其餘叫做從節點。
假設現在從任意網站發出登陸請求,最終都被帶到 http://a.com/login.php?from=b.com&sfkey=xxxxxx
,使用者輸入登陸資訊,假設登陸成功,返回一個登陸成功中間頁面,在這個頁面裡,包含下面html代碼
途牛最牛逼的首席架構師兼途牛董事會成員 @曹河圖的部落格
一個單點登入系統設計
如果你的要求不高 ucenter是一種解決方案說一個不同的答案吧——廣播機制。同樣,以http://a.com
作為主網域名稱,不論http://b.com
還是http://c.com
登入時請求都提交到http://a.com
,所有的儲存都在http://a.com
,其他網域名稱不允許訪問。在http://a.com
登入成功後,將登入資訊存放在http://a.com
域下的cookie中。此時發起廣播,由client端通知http://b.com
和http://c.com
,說使用者已經登入(僅僅是告訴他們已經登入),此時使用者訪問http://b.com
或者http://c.com
時有server端向http://a.com
請求擷取使用者資訊,並將非敏感資訊儲存到自己的儲存當中。同理,登出時也是向http://a.com
發起登出請求,http://a.com
將使用者cookie清掉,http://b.com
和http://c.com
再次向http://a.com
請求驗證使用者身份時,則驗證失敗。沒有樓上那些說的那麼複雜。
一般兩種方案:
1 共用SESSION(db,nosql等)
2 通過介面對每個網域名稱下寫cookie(常見ucenter)。
至於那些在頁面上做處理,不現實的。一則涉及面廣,二則維護不方便,也不符合業務封裝(模組化)的架構思維。如果不考慮異地部署話,可以將使用者登入資訊統一存在服務端的共用儲存裡,memcache或者redis都是可以的;當使用者由http://a.com
跳轉到http://b.com
之前在url中產生一個加密串,加密串中存放相應的登入資訊key及校正資訊。使用者跳轉到http://b.com
後解密url中的參數並去共用儲存中擷取使用者登入資訊。當然,如果需要相對安全一些,可以對使用者在http://a.com
時的sid、ip之類的資訊進行驗證,同時控制url中登入參數的生命週期。驗證通過後再在http://b.com
的伺服器上寫入本地登入資訊。退出的時候登出掉共用儲存中的登入資訊即可。
上述url中的登入參數作用類似於cas這類sso解決方案中的ticket。不錯!最後的結果呢?占坑… 等自己部落格更新後來埋答案