JSP Cookies處理
在本章中,我們將討論JSP中的Cookie處理。 Cookie是存儲在客戶端計算機上的文本文件,它們用於各種信息的跟蹤。JSP透明地支持使用底層servlet技術的HTTP Cookie。
識別和返回用戶信息有三個步驟 -
- 服務器腳本將一組Cookie發送到瀏覽器。例如姓名,年齡或身份證號等
- 瀏覽器將此信息存儲在本地機器上以備將來使用。
- 當下一次瀏覽器向Web服務器發送任何請求時,瀏覽器將這些cookie信息發送到服務器,服務器使用該信息來識別用戶,或者也可以用於其他目的。
本章將介紹如何設置或重置Cookie,如何訪問它們以及如何使用JSP程序來刪除它們。
Cookie剖析
Cookie通常設置在HTTP標頭中(儘管JavaScript也可以直接在瀏覽器上設置cookie
)。設置cookie的JSP響應頭髮送看起來類似這樣 -
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 = yiibai.com
Connection: close
Content-Type: text/html
可以看到,Set-Cookie
頭包含name
,GMT
,path
和domain
的鍵值對。名稱和值將被URL編碼。 expires
字段是指定的時間和日期之後瀏覽器刪除cookie的指令。
如果瀏覽器配置爲存儲cookie,那麼它將保留此信息直到指定期日。如果用戶將瀏覽器指向與Cookie的路徑和域匹配的任何頁面,則它將重新發送到服務器的cookie。瀏覽器的請求標頭看起來像這樣 -
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()
訪問Cookie,該方法返回一個Cookie
對象數組。
Servlet Cookie方法
下表列出了與Cookie
對象相關聯的有用方法,我們可以在JSP中操作Cookie時調用它們。
編號
方法
描述
1
public void setDomain(String pattern)
此方法設置適用Cookie的域; 例如,yiibai.com
。
2
public String getDomain()
此方法獲取適用Cookie的域; 例如,yiibai.com
。
3
public void setMaxAge(int expiry)
此方法設置在cookie過期之前經過多少時間(以秒爲單位)。如果沒有設置此項,cookie將僅持續到當前會話結束。
4
public int getMaxAge()
此方法返回cookie的最大時間,以秒爲單位指定。默認情況下,-1
表示cookie將持續到瀏覽器關閉。
5
public String getName()
此方法返回cookie的名稱。創建後不能更改名稱。
6
public void setValue(String newValue)
此方法設置與Cookie關聯的值。
7
public String getValue()
該方法獲取與cookie相關聯的值。
8
public void setPath(String uri)
此方法設置此cookie適用的路徑。如果不指定路徑,則將返回與當前頁面以及所有子目錄位於同一目錄中的所有URL的Cookie。
9
public String getPath()
此方法獲取此cookie應用的路徑。
10
public void setSecure(boolean flag)
此方法設置布爾值,指示Cookie是否應僅通過加密(即SSL)連接發送。
11
public void setComment(String purpose)
此方法指定描述Cookie目的的註釋。 如果瀏覽器向用戶顯示cookie,則該註釋很有用。
12
public String getComment()
此方法返回描述此cookie目的的註釋,如果cookie沒有註釋,則返回null
。
使用JSP設置Cookies
使用JSP設置cookie包括三個步驟 -
步驟1:創建一個Cookie對象
指定Cookie名稱和Cookie值調用Cookie構造函數,這兩者都是字符串。參考以下代碼 -
Cookie cookie = new Cookie("key","value");
請記住,名稱和值都不應包含空格或任何以下字符 -
[ ] ( ) = , " / ? @ : ;
步驟2:設置最大有效時間
可以使用setMaxAge
指定cookie應該有效的時間(以秒爲單位)。以下代碼將設置一個24
小時有效時間的cookie。
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24);
步驟3:將Cookie發送到HTTP響應頭
使用response.addCookie
在HTTP響應標頭中添加Cookie,如下所示 -
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
JSP操作Cookies示例
打開Eclipse,創建一個動態Web項目:CookiesHandling,其結構如下所示 -
假設要實現將用戶提交上來的用戶名和Email設置到cookie中,並返回到客戶端瀏覽器。請參考以下代碼 -
文件:setCookies.jsp -
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>接收表單並設置Cookies</title>
</head>
<body>
<%
// Create cookies for first and last names.
Cookie cookie1 = new Cookie("username", request.getParameter("username"));
Cookie cookie2 = new Cookie("email", request.getParameter("email"));
// Set expiry date after 24 Hrs for both the cookies.
cookie1.setMaxAge(60 * 60 * 24);
cookie2.setMaxAge(60 * 60 * 24);
// Add both the cookies in the response header.
response.addCookie(cookie1);
response.addCookie(cookie2);
%>
<div style="margin: auto; width: 80%;">
<center>
<h2>設置Cookies</h2>
</center>
<ul>
<li><p>
<b>用戶名:</b>
<%=request.getParameter("username")%>
</p></li>
<li><p>
<b>Email:</b>
<%=request.getParameter("email")%>
</p></li>
</ul>
</div>
</body>
</html>
創建另一個顯示錶單的HTML文件:form.jsp,其內容如下所示 -
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用戶表單</title>
</head>
<body>
<div style="margin: auto; width: 80%">
<form action="setCookies.jsp" method="POST">
用戶名: <input type="text" name="username">
Email: <input type="text" name="email" /> <input
type="submit" value="提交" />
</form>
</div>
</body>
</html>
當編寫上面代碼完成後,部署和運行這個項目,打開瀏覽器訪問URL:http://localhost:8080/CookiesHandling/form.html , 在顯示的表單中輸入用戶名和Email,然後單擊提交按鈕。這將在屏幕上顯示用戶名和Email,並且還將設置兩個cookie:username
和email
。當下次訪問頁面時,這些Cookie將被傳回服務器。
分別在用戶名和Email輸入框中填寫:maxsu 和 [email protected] , 然後點擊提交 -
在下一節中,我們將介紹如何在Web應用程序中訪問這些cookie。
使用JSP讀取Cookies
要使用JSP讀取cookie,需要通過調用HttpServletRequest
的getCookies()
方法來創建一個javax.servlet.http.Cookie
對象的數組。 然後循環遍歷數組,並使用getName()
和getValue()
方法來訪問每個cookie和關聯的值。
現在來看看如何讀取前面的例子中設置的cookie,創建一個JSP文件:getCookies.jsp -
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>讀取Cookies</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<%
Cookie cookie = null;
Cookie[] cookies = null;
// Get an array of Cookies associated with the this domain
cookies = request.getCookies();
if (cookies != null) {
out.println("<h2>找到的Cookie名稱和值</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>");
}
%>
</div>
</body>
</html>
重新部署項目,打開瀏覽器訪問URL: http://localhost:8080/CookiesHandling/getCookies.jsp ,應該會看到結果如下 -
使用JSP刪除Cookie
刪除cookies非常簡單。如果想要刪除一個cookie,那麼只需要按照這三個步驟 -
- 讀取已存在的cookie並將其存儲在Cookie對象中。
- 使用
setMaxAge()
方法將Cookie的過期時間設置爲零,以刪除現有的Cookie。 - 將此cookie添加回響應頭。
以下示例將顯示如何刪除名爲username
的現有Cookie,並且下次運行訪問getcookies.jsp
時,將不再返回username
的cookies值。
文件:deleteCookies.jsp -
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>刪除Cookies</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<center>
<h1>刪除Cookies</h1>
</center>
<%
Cookie cookie = null;
Cookie[] cookies = null;
// Get an array of Cookies associated with the this domain
cookies = request.getCookies();
if( cookies != null ) {
out.println("<h2>找到的Cookie名稱和值</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
if(cookie.getName().equals("username")) {
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>");
}
%>
</div>
</body>
</html>
重新部署項目,打開瀏覽器訪問URL: http://localhost:8080/CookiesHandling/deleteCookies.jsp ,應該會看到結果如下 -
現在再次運行:getCookies.jsp,它應該只顯示一個cookie,如下所示:
也可以手動刪除瀏覽器中的Cookie。從工具菜單開始,選擇Internet選項。要刪除所有Cookie,請單擊刪除Cookie按鈕。