Cookie/Session的跨域共享

單點登錄(SSO——Single Sign On)對于我們來說已經不陌生了。對于大型系統來說使用單點登錄可以減少用戶很多的麻煩。就拿百度來說吧,百度下面有很多的子系統——百度經驗、百度知道、百度文庫等等,如果我們使用這些系統的時候,每一個系統都需要我們輸入用戶名和密碼登錄一次的話,我相信用戶體驗肯定會直線下降。當然,對于個人博客這類系統來說根本就用不上單點登錄了。
假如,我們的系統很龐大,但是就是這一個系統,并沒有什么子系統。這時我們也不需要單點登錄。這里不涉及多臺主機負載均衡session共享的問題。

在同一個域名下的不同站點是如何進行驗證的
如果兩個站點可以共享相同的驗證Cookie,這將很容易實現使用同一個用戶登錄多個站點。按照HTTP協議規定,兩個站點是可以共享Cookie的。前提是這兩個站點是在同一個域名下面(或者是二級域名也可)。這種情況是屬于同域下的Cookie。瀏覽器會將Cookie以及該Cookie所屬的域存在本地。當你對該域下的任何子站點進行訪問的時候,瀏覽器都會將這些Cookie發送給站點系統。
假設我們有兩個站點

www.onmpw.com/site1
www.onmpw.com/site2

這兩個站點共享同一個主機地址,并且二者在同一域名下。加入你剛剛登錄了www.onmpw.com/site1,你的瀏覽器會有一個來自www.onmpw.com/site1的身份鑒證的cookie。當你點擊site1下的任何的子頁面的時候,這些cookie都會發送給site1。這是很容易理解的。同樣的,當你請求www.onmpw.com/site2的時候,對于site2下面的任何頁面這些cookie也同樣會隨著請求發送過去。為什么是這樣,因為在瀏覽器端存儲的cookie的域是www.onmpw.com。site1和site2兩個站點是同屬于該域的。所以對于該域下的cookie,兩個站點都可以得到。只需要按照正常的驗證方式進行驗證即可。因為二者的sessionId是相同的,只要它們的session信息是保存在同一個地方即可。

同一個域但是不同的子域如何進行單點登錄
假如我們的站點是按照下面的域名進行部署的

sub1.onmpw.com
sub2.onmpw.com

這兩個站點共享同一域onmpw.com。默認情況下,瀏覽器會發送cookie所屬的域對應的主機。也就是說,來自于sub1.onmpw.com的cookie默認所屬的域是.sub1.onmpw.com。因此,sub2.onmpw.com不會得到任何的屬于sub1.onmpw.com的cookie信息。因為它們是在不同的主機上面,并且二者的子域也是不同的。
這時可以設置二者的cookie信息在同一個域下。
1.登錄sub1.onmpw.com系統
2.登錄成功以后,設置cookie信息。這里需要注意,我們可以將用戶名和密碼存到cookie中,但是在設置的時候必須將這cookie的所屬域設置為頂級域 .onmpw.com。這里可以使用setcookie函數,該函數的第四個參數是用來設置cookie所述域的。

cookie.setDomain(".onmpw.com");

3.訪問sub2.onmpw.com系統,瀏覽器會將cookie中的信息username和password附帶在請求中一塊兒發送到sub2.onmpw.com系統。這時該系統會先檢查session是否登錄,如果沒有登錄則驗證cookie中的username和password從而實現自動登錄。
4.sub2.onmpw.com 登錄成功以后再寫session信息。以后的驗證就用自己的session信息驗證就可以了。
當然,先登錄sub2.onmpw.com的方式也是相同的。經過上面的步驟就可以實現不同二級域名的單點登錄了。

但是,這里存在一個問題就是sub1系統退出以后,除了可以清除自身的session信息和所屬域為.onmpw.com的cookie的信息。它并不能清除sub2系統的session信息。那sub2仍然是登錄狀態。也就是說,這種方式雖說可以實現單點登錄,但是不能實現同時退出。原因是,我們只是把用戶名和密碼的cookie通過setDomain設置成共享cookie。但是二者的sessionId是不同的,而且這個sessionId在瀏覽器中也是以cookie的形式存儲的,不過它所屬的域并不是.onmpw.com。也就是說二者的sessionId是不同的。

解決方案:
把第一次登錄生成的JSESSIONID,通過setDomain放到一個共享的的自定義的cookie中。之后訪問二級域名的時候,將自定義cookie中的的值取出來,然后在放到JSESSIONID的cookie的值中。參考

Cookie c = new Cookie("JSESSIONID", session.getId());  
c.setDomain("abc.com");  
resp.addCookie(c);

要點:不同的子域的Cookie可以共享。Session跨子域需要把JESSIONID寫進共享Cookie(雖然JSEESIONID就是本身Cookie,但由于tomcat創建的,他的domain屬性是跟你當前站的域名是嚴格保持一致的)。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容