Cookies是存儲在客戶機(jī)的文本文件,它們保存了大量軌跡信息。在servlet技術(shù)基礎(chǔ)上,JSP顯然能夠提供對HTTP cookies的支持。
通常有三個步驟來識別回頭客:
本章節(jié)將會傳授您如何去設(shè)置或重設(shè)cookie的方法,還有如何訪問它們及如何刪除它們。
Cookies通常在HTTP信息頭中設(shè)置(雖然JavaScript能夠直接在瀏覽器中設(shè)置cookies)。在JSP中,設(shè)置一個cookie需要發(fā)送如下的信息頭給服務(wù)器:
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT;
path=/; domain=tutorialspoint.com
Connection: close
Content-Type: text/html
正如您所見,Set-Cookie信息頭包含一個鍵值對,一個GMT(格林尼治標(biāo)準(zhǔn))時間,一個路徑,一個域名。鍵值對會被編碼為URL。有效期域是個指令,告訴瀏覽器在什么時候之后就可以清除這個cookie。
如果瀏覽器被配置成可存儲cookies,那么它將會保存這些信息直到過期。如果用戶訪問的任何頁面匹配了cookie中的路徑和域名,那么瀏覽器將會重新將這個cookie發(fā)回給服務(wù)器。瀏覽器端的信息頭長得就像下面這樣:
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz
JSP腳本通過request對象中的getCookies()方法來訪問這些cookies,這個方法會返回一個Cookie對象的數(shù)組。
下表列出了Cookie對象中常用的方法:
序號 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern) 設(shè)置cookie的域名,比如w3cschool.cn |
2 | public String getDomain() 獲取cookie的域名,比如w3cschool.cn |
3 | public void setMaxAge(int expiry) 設(shè)置cookie有效期,以秒為單位,默認(rèn)有效期為當(dāng)前session的存活時間 |
4 | public int getMaxAge() 獲取cookie有效期,以秒為單位,默認(rèn)為-1 ,表明cookie會活到瀏覽器關(guān)閉為止 |
5 | public String getName() 返回 cookie的名稱,名稱創(chuàng)建后將不能被修改 |
6 | public void setValue(String newValue) 設(shè)置 cookie的值 |
7 | public String getValue() 獲取cookie的值 |
8 | public void setPath(String uri) 設(shè)置cookie 的路徑,默認(rèn)為當(dāng)前頁面目錄下的所有URL,還有此目錄下的所有子目錄 |
9 | public String getPath() 獲取cookie 的路徑 |
10 | public void setSecure(boolean flag) 指明cookie是否要加密傳輸 |
11 | public void setComment(String purpose) 設(shè)置注釋描述 cookie的目的。當(dāng)瀏覽器將cookie展現(xiàn)給用戶時,注釋將會變得非常有用 |
12 | public String getComment() 返回描述cookie目的的注釋,若沒有則返回null |
使用JSP設(shè)置cookie包含三個步驟:
(1)創(chuàng)建一個Cookie對象: 調(diào)用Cookie的構(gòu)造函數(shù),使用一個cookie名稱和值做參數(shù),它們都是字符串。
Cookie cookie = new Cookie("key","value");
請務(wù)必牢記,名稱和值中都不能包含空格或者如下的字符:
[ ] ( ) = , " / ? @ : ;
(2) 設(shè)置有效期:調(diào)用setMaxAge()函數(shù)表明cookie在多長時間(以秒為單位)內(nèi)有效。下面的操作將有效期設(shè)為了24小時。
cookie.setMaxAge(60*60*24);
(3) 將cookie發(fā)送至HTTP響應(yīng)頭中:調(diào)用response.addCookie()函數(shù)來向HTTP響應(yīng)頭中添加cookies。
response.addCookie(cookie);
<%
// 為 first_name 和 last_name設(shè)置cookie
Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
Cookie lastName = new Cookie("last_name",request.getParameter("last_name"));
// 設(shè)置cookie過期時間為24小時。
firstName.setMaxAge(60*60*24);
lastName.setMaxAge(60*60*24);
// 在響應(yīng)頭部添加cookie
response.addCookie( firstName );
response.addCookie( lastName );
%>
<html>
<head>
<title>Setting Cookies</title>
</head>
<body>
<center>
<h1>Setting Cookies</h1>
</center>
<ul>
<li><p><b>First Name:</b>
<%= request.getParameter("first_name")%>
</p></li>
<li><p><b>Last Name:</b>
<%= request.getParameter("last_name")%>
</p></li>
</ul>
</body>
</html>
將上面的文件放在<Tomcat安裝目錄>/webapps/ROOT目錄下,然后訪問http://localhost:8080/hello.jsp,將會得到如下輸出結(jié)果:
試著輸入First Name和Last Name,然后點(diǎn)擊提交按鈕,它將會在您的屏幕中顯示first name和last name,并且設(shè)置first name和last name兩個cookie,下一次點(diǎn)擊提交按鈕時會發(fā)給服務(wù)器。
想要讀取cookies,您就需要調(diào)用request.getCookies()方法來獲得一個javax.servlet.http.Cookie對象的數(shù)組,然后遍歷這個數(shù)組,使用getName()方法和getValue()方法來獲取每一個cookie的名稱和值。
讓我們來讀取上個例子中的cookies。
<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
Cookie cookie = null;
Cookie[] cookies = null;
// 獲取cookies的數(shù)據(jù),是一個數(shù)組
cookies = request.getCookies();
if( cookies != null ){
out.println("<h2> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++){
cookie = cookies[i];
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
}else{
out.println("<h2>No cookies founds</h2>");
}
%>
</body>
</html>
如果您把first name cookie設(shè)置成"John",last name設(shè)置成"Player",訪問 http://localhost:8080/main.jsp,將會得到如下輸出結(jié)果:
Found Cookies Name and Value
Name : first_name, Value: John
Name : last_name, Value: Player
刪除cookies非常簡單。如果您想要刪除一個cookie,按照下面給的步驟來做就行了:
下面的程序刪除一個名為"first_name"的cookie,當(dāng)您下次運(yùn)行main.jsp時,first_name將會為null。
<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
Cookie cookie = null;
Cookie[] cookies = null;
// 獲取當(dāng)前域名下的cookies,是一個數(shù)組
cookies = request.getCookies();
if( cookies != null ){
out.println("<h2> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++){
cookie = cookies[i];
if((cookie.getName( )).compareTo("first_name") == 0 ){
cookie.setMaxAge(0);
response.addCookie(cookie);
out.print("Deleted cookie: " +
cookie.getName( ) + "<br/>");
}
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
}else{
out.println(
"<h2>No cookies founds</h2>");
}
%>
</body>
</html>
訪問它,將會得到如下輸出結(jié)果:
Cookies Name and Value
Deleted cookie : first_name
Name : first_name, Value: John
Name : last_name, Value: Player
再次訪問http://localhost:8080/main.jsp,將會得到如下結(jié)果:
Found Cookies Name and Value
Name : last_name, Value: Player
您也可以手動在瀏覽器中刪除cookies。點(diǎn)擊Tools菜單項(xiàng),然后選擇Internet Options,點(diǎn)擊Delete Cookies,就能刪除所有cookies了。
更多建議: