国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
java sso cookie 跨域
userphoto

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空間 - 博客園
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服