1.Cookie路徑介紹
我們知道Cookie的屬性有很多,其中有一個屬性是路徑。有些人認為Cookie的路徑指的是Cookie在客戶端的保存路徑,其實并不是。
Cookie的路徑是在服務(wù)器創(chuàng)建Cookie時設(shè)置的,它的作用是決定瀏覽器訪問服務(wù)器的某個資源時,需要將瀏覽器端保存的那些Cookie歸還給服務(wù)器。如圖1-1所示:
圖1-1 cookie路徑
圖1-1中,瀏覽器端保存的Cookie有三個,分別是Cookie1、Cookie2和Cookie3。它們?nèi)齻€的訪問路徑分別為:“/Example/cookie“、”/Example/“、”Example1/cookie“。瀏覽器訪問服務(wù)器端的路徑為:”http://localhost:8080/Example/cookie/a/index.jsp“。也就是說index.jsp頁面的訪問路徑為:”/Example/cookie/a/“,該路徑包含了Cookie1和Cookie2的路徑,因此在訪問index.jsp時,瀏覽器會將Cookie1和Cookie2發(fā)送給服務(wù)器。這就是Cookie的路徑的作用,其中涉及到訪問路徑。
如果服務(wù)器創(chuàng)建Cookie時沒有設(shè)置路徑,那么該Cookie的路徑是當前資源的訪問路徑。例如:在index.jsp頁面中創(chuàng)建了一個Cookie,index.jsp頁面的訪問路徑為“/Example/“,那么該Cookie的路徑就是”/Example/“。如果服務(wù)器創(chuàng)建Cookie時設(shè)置了路徑,那么Cookie的路徑就是設(shè)置的路徑,例如:cookie.setPath(“/Example/cookie”),那么該Cookie的路徑就是”/Example/cookie“。
2.Cookie路徑練習(xí)
通過上面對Cookie路徑的介紹,我們對它有了一定的了解,現(xiàn)在通過一個案例來驗證以上結(jié)論。具體步驟如下:
(1)創(chuàng)建一個web應(yīng)用,Example20,在該應(yīng)用下的WebRoot目錄下新建一個目錄cookie,并在該目錄下新建一個jsp文件,名稱為one.jsp,主要代碼如例1-1所示:
例1-1 one.jsp
<body>
<%
Cookie cookie=new Cookie("one","hello");
response.addCookie(cookie);
%>
</body>
例1-1中,服務(wù)器創(chuàng)建cookie但是并沒有設(shè)置其路徑,那么該cookie的路徑應(yīng)為one.jsp的訪問路徑。
(2)將Example20發(fā)布到服務(wù)器,然后啟動服務(wù)器,在谷歌瀏覽器端地址欄上輸入:http://localhost:8080/Example20/cookie/one.jsp,然后查看cookie信息,如圖1-2所示:
圖1-2 cookie信息
由圖1-2可知,cookie的路徑是:“/Example20/cookie“,該路徑正是one.jsp頁面的訪問路徑。
(3)在WebRoot目錄下的cookie目錄中新建一個jsp文件,名稱為two.jsp,主要代碼如例1-2所示:
例1-2 two.jsp
<body>
<%
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
out.print(c.getName()+"="+c.getValue()+"<br>");
}
}
%>
</body>
(4)重新啟動服務(wù)器,在瀏覽器端地址欄上輸入:http://localhost:8080/Example20/cookie/two.jsp,并使用瀏覽器的開發(fā)者工具,查看請求信息中的cookie,如圖1-3所示:
圖1-3 請求信息
由圖1-3可知,在訪問two.jsp頁面時,瀏覽器將名稱為one和JSESSIONID的cookie歸還給服務(wù)器。因為two.jsp頁面的訪問路徑也是“/Example20/cookie”。JSESSIONID能夠發(fā)送過來是因為它的路徑是“/Example20/”,也包含在訪問路徑中,因此被瀏覽器發(fā)送過來。
(5)在瀏覽器端訪問Example20工程的index.jsp頁面,訪問路徑為:http://localhost:8080/Example20,使用開發(fā)者工具查看請求信息,觀察名稱為one的cookie是否在請求信息中,如圖1-4所示:
圖1-4 請求信息
由圖1-4可知,訪問index.jsp頁面時,瀏覽器只將名稱為JSESSIONID的cookie發(fā)送給服務(wù)器,而名稱為one的cookie并沒有發(fā)送服務(wù)器,原因是index.jsp頁面的訪問路徑是“/Example20/”,而one的訪問路徑是“/Example20/cookie”,index.jsp頁面的訪問路徑并不包含one的路徑。
需要注意的是,大家不要將包含的關(guān)系弄混淆了,是訪問路徑包含cookie的路徑。例如,瀏覽器中保存如下幾個cookie,它們的路徑分別是:
aCookie.path=/Example20/;bCookie.path=/Example20/jsps/;cCookie.path=/Example20/jsps/cookie
- 訪問路徑是:http://localhost:8080/Example20/index.jsp
瀏覽器發(fā)送給服務(wù)器的cookie有:aCookie;
- 訪問路徑是:http://localhost:8080/Example20/jsps/a.jsp
瀏覽器發(fā)送給服務(wù)器的cookie有:aCookie,bCookie;
- 訪問路徑是:http://localhost:8080/Example20/jsps/cookie/b.jsp
瀏覽器發(fā)送給服務(wù)器的cookie有:aCookie,bCookie,cCookie。
3.Cookie的域
Cookie還有一個屬性就是域,Cookie類中有設(shè)置和獲取cookie域的方法,如下所示:
- Void setDomain(String pattern):設(shè)置cookie的域;
- String getDomain():獲取cookie的域,返回值的類型是String類型。
其中Domain單詞就有域名的意思。一般我們很少使用cookie的域,只有在多個二級域共享Cookie時才用。例如:www.baidu.com、zhidao.baidu.com、news.baidu.com、tieba.baidu.com這些域可以理解是百度的子項目,現(xiàn)在要在這些域中共享cookie,就需要使用cookie的域,使用時需要注意以下兩點:
- 設(shè)置domain為:setDomain(".baidu.com”);
- 設(shè)置path為:setPath(“/”)。
我們?nèi)绻约涸O(shè)置Cookie的域,需要在電腦上配置
虛擬主機,下面大家按照以下的步驟操作,如下:
(1) 在C:\WINDOWS\system32\drivers\etc\hosts文件中添加如下內(nèi)容:
127.0.0.1 news.qdmmy6.com
127.0.0.1 tieba.qdmmy6.com
這兩個域名后面兩個單詞要一致,如:qdmmy6.com。
(2) 在Tomcat的安裝目錄下的/conf/server.xml文件中添加如下配置:
<Host name="news.qdmmy6.com" appBase="news"
unpackWARs="true" autoDeploy="true">
<Value className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="tieba.qdmmy6.com" appBase="tieba"
unpackWARs="true" autoDeploy="true">
<Value className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
(3)點擊此處下載
資源,將它們解壓后拷貝到Tomcat的安裝目錄下。
(4)啟動Tomcat服務(wù)器,在瀏覽器端訪問:http://news.qdmmy6.com/SaveServlet.使用HttpWatch或者其他開發(fā)者工具查看請求響應(yīng)信息,觀察cookie的信息。
(5)在瀏覽器端訪問:http://tieba.qdmmy6.com/GetServle,使用HttpWatch或者其他開發(fā)者工具查看請求響應(yīng)信息,觀察cookie的信息。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee