前言
今天本來想寫一篇關於Session實現單點登入的文章,寫一半的時候,發現自己仍然有些問題是很無法解釋清楚的,所以只能自己解決之後再寫。而頂級域名下的子域名實現Cookie共享是Session單點問題的一個案例,所以現在抽取出來了解一下。
背景許多公司都會擁有自己入口網站,如果我們在門戶系統點選登入之後,那麼我們在進入該公司的其他網站的時候,通常不會重複登入。為什麼會這樣呢?如果我們細心觀察一下的話,我們會發現大多數他們都是擁有相同字尾(二級域名),比如百度,頂級域名是www.baidu.com,而該域名下面:
BBS網站是:bbs.baidu.com
部落格網站是:blog.baidu.com
他們就屬於相同的子級域名。
實現方案如果你沒有那麼多伺服器,也沒有域名,那麼測試這種效果就需要一些特殊的操作:修改hosts檔案(他的作用,這裡就不說了) 我這裡增加了兩行 ,指向IP:127.0.0.1
127.0.0.1 sso.java.net
127.0.0.1 bbs.java.net
然後我們搭建兩個專案,SSO和BBS,對應上面不同的域名,因為Cookie是以域名來進行隔離的,所以僅僅是埠號不同,不足以驗證Cookie共享的效果。
我們在SSO的專案中增加下面的程式碼:
@RequestMapping("email/login")@ResponseBodypublic void emailLogin(HttpServletRequest request,HttpServletResponse response,@RequestBody ) { Cookie token = new Cookie("token", "123123"); token.setDomain("java.net"); token.setPath("/"); token.setMaxAge(10000); response.addCookie(token);}
然後我們訪問這個介面,如下圖
我們可以看到token這個欄位已經jsessionid(關於jsessionid本來是今天要聊的,因為中間測試出了一些自己很疑惑的問題,所以下次再說)。
然後我們訪問bbs專案,這裡我們單純寫一個介面就可以了:
@RequestMapping("testSession")@ResponseBodypublic boolean testSession() { return true;}
然後我們訪問bbs.java.net:81的專案,可以如下圖
BBS域名
我們可以看到他們token已經到bbs.java.net這個域名下了,且於sso.java.net是相同的值。目前這種方式在很多企業仍然被採用,因為cookie的共享,也就實現單點登入。