基於二級域名下Cookie共享的SSO

網上已經有很多基於二級域名下Cookie共享的SSO的解決方案,對於原理大家可能都很瞭解,無非就是登錄一個系統,產生一個令牌保存到Client端的cookie中,這個cookie是基於主域名的,然後再登錄其它二級域名下的系統,就會直接讀取主域名下的Cookie中的令牌,不要重新登錄,方面用戶使用多個系統。正好做到的項目中用到這個SSO登錄驗證,自己調試中遇到一些問題,以及解決方案,跟大家分享一下。

 

我的項目中有兩個系統,域名分別是A.test.com,B.test.com(舉例),test.com是一級域名,A.test.com&B.test.com是二級域名。任務是要做到在A登錄後可以直接進入B系統,B系統會驗證Cookie的令牌信息,正確的令牌才允許訪問進入系統。A系統訪問路徑是http://A.test.com/x,B系統的訪問路徑是http://B.test.com/y。

 

好了,下面開始說明一下我的解決歷程:

 

1.編碼

 

  在A系統登錄成功後寫入Cookie

  ....

  Cookie cookie=new Cookie("token","令牌信息");//關於令牌名稱可以約定一個,到時B系統會根據這個名稱去獲取令牌信息,信息令牌是加密處理r後的字符串,如何加密這裏不再贅述。

 ....

  cookie.setDomain("test.com");//是基於一級域名的

  cookie.setMaxAge(1800);//設定Cookie的有效期

  response.addCookie(cookie);

  ....

 

2.測試檢查

通過http://A.test.com/x訪問後,Cookie目錄出現一個[email protected][1]的Cookie文件,查看IE緩存目錄,有一條名爲x/的記錄,internet地址爲Cookie:[email protected]/x,系統緩存目錄地址C:/Documents and Settings/administrator/Local Settings/Temporary Internet Files,我的是XP系統,Cookie目錄地址C:/Documents and Settings/administrator/Cookies。

 

通過http://B.test.com/y訪問後,根據讀取不到這個Cookie,爲了測試方便,我在Y/下的index.jsp中,寫了一段代碼,就是往Cookie中寫一些信息,看它會保存到哪個cookie文件中,測試後發現在Cookie目錄會生成一個[email protected][2]的文件,然後再IE緩存有一條名y/的記錄,internet地址爲Cookie:[email protected]/y,反覆訪問刷新後,A和B的Cookie總會不一樣,文件名分別在[1],[2]之間變換,反正就不會是一個文件。

 

3.反複分析

 

比較Cookie和緩存中文件,發現就是x&y不一至,於是動手把A下的x系統和B下的y系統的webapp name都改成統一的,再試,成功了!兩個系統可以合併到一個Cookie中了。

 

4.總結

要想在兩個二級域名下共享Cookie,第一,設定的cookie要設定setDomain(一級域名);第二,訪問的兩個系統的webapp name一至。

如果兩個系統直接是基於域名跑的,http://A.test.com,http://B.test.com,就沒有後面那個修改webapp name的問題了,只要確保寫Cookie時,setDomain(一級域名),這裏是"test.com"。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章