国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看
打開APP
未登錄
開通VIP,暢享免費電子書等14項超值服
開通VIP
首頁
好書
留言交流
下載APP
聯(lián)系客服
java sso cookie 跨域
HaiLan
>《SSO》
2013.05.07
關注
做J2EE開發(fā)已經(jīng)好幾年了,對cookie的了解僅限于知道其使用方式、優(yōu)缺點及一些簡單的基本原理,工作中有些項目也使用cookie,
基本上都是用于記錄用戶的登錄信息(有很多知名網(wǎng)站用于記錄客戶個人信息或訪問習慣的鄙視一下),再次訪問時不需要再次登錄,
由于我是做企業(yè)應用的,因此一般cookie也會用于做sso的方案,這個確實非常方便,尤其是多機集群環(huán)境下,一個節(jié)點宕機,只要有另一個節(jié)點能提供服務,
用戶就不會有所感知,避免了session復制這種重量級方案。
網(wǎng)上關于cookie的資料比較多也比較雜,有討論用各種語言操作cookie的,也有討論用cookie如何實現(xiàn)sso的,也有變相實現(xiàn)cookie跨域訪問的方案,今天準備用java/jsp做一個cookie操作的完整測試,一方面加深印象,一方面給做企業(yè)應用的新手朋友一個指引,只要耐心將下邊各個測試過程跟下來,保證你對cookie會有一個更深層次的認識。
多的不說了,測試環(huán)境JDK1.5 + Eclipse3.6 + Tomcat5.0.28測試過程如下:
開發(fā)2個web應用,分別為web1和web2,
web1應用的web根下創(chuàng)建一個index.jsp,內(nèi)容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
System.out.println("web1----cookie name:"+cookie.getName()+" value:"+cookie.getValue());
if("myCookieName".equals(cookie.getName())){//如果cookie已存在則刪除掉
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}
//用java代碼創(chuàng)建cookie的方法如下,構造的參數(shù)是cookie的name和value
Cookie cookie = new Cookie("myCookieName","myCookieValue1");
cookie.setPath("/");
response.addCookie(cookie);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
This is web1's index.jsp
</body>
</html>
web2應用的web根下創(chuàng)建一個index.jsp,內(nèi)容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
System.out.println("web1----cookie name:"+cookie.getName()+" value:"+cookie.getValue());
if("myCookieName".equals(cookie.getName())){//如果cookie已存在則刪除掉
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
This is web2's index.jsp
</body>
</html>
2個應用基本一樣,web1負責獲取系統(tǒng)中的cookie然后輸出name和value到控制臺,并創(chuàng)建一個cookie,web2則只獲取cookie然后輸出name和value到控制臺,這兩個應用功能非常好理解。
2個應用部署到一個tomcat下,端口為80,兩個應用的訪問路徑分為別:
http://127.0.0.1/web1 和 http://127.0.0.1/web2 接下來是測試過程
首先用IE8訪問web1,為了看到我們創(chuàng)建的cookie,所以需要多刷新幾下,這時控制臺輸出如下(去除重復項后):
web1----name:JSESSIONID value:D402D19B22D8E3437ECF36785B0853E1
web1----name:myCookieName value:myCookieValue1
清空控制臺日志,然后用IE8訪問web2,這時控制臺輸出如下:
web2----name:JSESSIONID value:3E7B632C0074FD5EBA409005271EAC9C
web2----name:myCookieName value:myCookieValue1
這時說明2個應用是共享cookie的,但此時并沒有實現(xiàn)cookie的跨域訪問
以上同樣的測試我換成了360瀏覽器,并且開啟了2個360瀏覽器的實例(非多標簽),詭異的一幕出現(xiàn)了,訪問web2應用的時候無法獲得web1應用創(chuàng)建的cookie了,試了好多方法都不行,后來用360瀏覽器多標簽的方式:
訪問測試了一下結果發(fā)現(xiàn)從web2可以訪問到web1創(chuàng)建的cookie了,回想當初學習cookie知識的時候想到了一個細節(jié),如果cookie的maxAge默認不設置的話,cookie默認是存儲在瀏覽器的內(nèi)存(緩存)當中的,web1創(chuàng)建的cookie就沒有設置這個屬性,因此得出360瀏覽器開啟多個實例的情況下其各自都自己的內(nèi)存空間,而IE8則不然,多標簽或多實例都共用一個內(nèi)存,那么如果想使用360瀏覽器多實例共享cookie的辦法只有給cookie設置maxAge屬性了(這樣cookie會存儲到磁盤中),因此web1的index.jsp代碼調(diào)整了一下:
Cookie cookie = new Cookie("myCookieName","myCookieValue1");
cookie.setPath("/");
cookie.setMaxAge(180);//設置存活周期為3分鐘
response.addCookie(cookie);
再次測試,發(fā)現(xiàn)web2已經(jīng)可以訪問到web1創(chuàng)建的cookie了,并且在3分鐘后再次刷新web2應用發(fā)現(xiàn)cookie失效(補充一點,cookie的失效不需要服務器監(jiān)控其生命周期,通常瀏覽器自己會處理),一切正常,至此第一個測試內(nèi)容結束。
第二個測試
內(nèi)容開始,問題是這樣,實際項目中客戶不會使用ip地址訪問應用系統(tǒng)的,一般都會設置域名,因此準備用域名訪問一下我這兩個應用,測試方式:
在C:\WINDOWS\system32\drivers\etc的hosts文件中添加如下內(nèi)容:
127.0.0.1 www.myweb.com
這樣在瀏覽器中訪問www.myweb.com時首先會到hosts文件中查找,找不到才會使用DNS去解析,使用這種方法進行測試,分別訪問:
http://www.myweb.com/web1 和 http://www.myweb.com/web2
結果也是一切正常,但通過httpwatch監(jiān)控發(fā)現(xiàn)如果cookie不設置domain的話,默認則為當前域名,即:www.myweb.com(記住這個,很重要),兩個應用使用同一個域名,所以cookie同樣可以共享,也證明了域名后邊斜線之后的內(nèi)容是不影響cookie的,至此第二個測試內(nèi)容結束,這里也補充說一句如果你用代碼獲取cookie然后查看其maxAge、path、domain等屬性發(fā)現(xiàn)它的值可能是null,這是由應用服務器內(nèi)部實現(xiàn)類決定的,這不代表你存進去的也是null,通過httpwatch是可以查看到cookie這些屬性值的。
第三個測試
開始,與第二個類似,但域名要稍稍改變一下,
在C:\WINDOWS\system32\drivers\etc的hosts文件中添加如下內(nèi)容:
127.0.0.1 web1.myweb.com
127.0.0.1 web2.myweb.com
然后使用IE8分別訪問:
http://web1.myweb.com/web1 和 http://web2.myweb.com/web2
測試結果:web2應用無法訪問到web1應用創(chuàng)建的cookie,原因如下:
訪問web1時cookie的domain沒有設置,那么默認為web1.myweb.com,根據(jù)cookie不能跨域訪問的規(guī)則,訪問web2時web2.myweb.com域自然不能訪問web1.myweb.com域的cookie,但其一(頂)級域名(myweb.com)是相同的,這時候有辦法可以解決,即將web1的代碼修改如下:
Cookie cookie = new Cookie("myCookieName","myCookieValue1");
cookie.setPath("/");
cookie.setMaxAge(180);//設置存活周期為3分鐘
cookie.setDomain(".myweb.com");
response.addCookie(cookie);
分別訪問web1和web2,一切正常,web2又可以訪問的web1的cookie了,至此第三個測試結束,證明了一(頂)級域名相同的情況下,cookie是可以實現(xiàn)二級(三級以上也可以)域名應用跨域訪問的。(補充說一句,確定域名是幾級的最簡單辦法是數(shù)域名中有幾個點,比如baidu.com是一級域名而www.baidu.com就是二級域名以此類推,而www.baidu.com/index.php紅色字體部分不屬于域名,所以這部分也不會影響cookie)
第四個測試
內(nèi)容比較重要,要模擬的是2個應用的一級域名不同的情況,比如web1應用域名為:www.web1.com 而web2的域名為www.web2.com,還是使用hosts文件模擬不同域名訪問情況,在C:\WINDOWS\system32\drivers\etc的hosts文件中添加如下內(nèi)容:
127.0.0.1 www.web1.com
127.0.0.1 www.web2.com
然后使用IE8分別訪問http://www.web1.com/web1 和 http://www.web2.com/web2
結果證實,訪問web2應用的時候無法獲得web1的cookie,再訪問http://www.web1com/web2
(注意紅色字),這時cookie又出來了,結論如下:cookie的domain默認即為瀏覽器訪問輸入的內(nèi)容,是域名即域名內(nèi)容,是ip地址即為ip地址,不同ip地址、一級域名不同的應用之間不能共享cookie,這是cookie的規(guī)范,沒有辦法,無論你怎么設置domain都是徒勞的,所以做企業(yè)應用實施過程中2個應用要通過cookie做sso,一定要讓其一級域名相同(客戶不一定會聽你的),否則趕緊想其他辦法,不要在這浪費時間了,真正的跨域sso不是單純靠cookie就能做到的,后續(xù)準備整理一些比較好的跨域sso方案共享出來。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報
。
打開APP,閱讀全文并永久保存
查看更多類似文章
猜你喜歡
類似文章
京東SSO單點登陸實現(xiàn)分析
SSO單點登錄、跨域重定向、跨域設置Cookie、京東單點登錄實例分析
小白學 Python 爬蟲(10):Session 和 Cookies
二級域名Cookies共享或跨域共享
cookie對象
翻譯:Single Sign-On for Everyone - Anders Liu的.NET空間 - 博客園
更多類似文章 >>
生活服務
首頁
萬象
文化
人生
生活
健康
教育
職場
理財
娛樂
藝術
上網(wǎng)
留言交流
回頂部
聯(lián)系我們
分享
收藏
點擊這里,查看已保存的文章
導長圖
關注
一鍵復制
下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!
聯(lián)系客服
微信登錄中...
請勿關閉此頁面
先別劃走!
送你5元優(yōu)惠券,購買VIP限時立減!
5
元
優(yōu)惠券
優(yōu)惠券還有
10:00
過期
馬上使用
×