Servlet Cookie 處理
Cookie是存儲在客戶端計算機上的文本文件,並保留了各種跟蹤信息。Java Servlet顯然支持HTTP Cookie。
識別返回用戶包括三個步驟:
- 服務器腳本向瀏覽器發送一組Cookie。例如:姓名、年齡或識別號碼等。
- 瀏覽器將這些信息存儲在本地計算機上,以備將來使用。
- 當下一次瀏覽器向Web服務器發送任何請求時,瀏覽器會把這些Cookie信息發送到服務器,服務器將使用這些信息來識別用戶。
這裏將詳細講解如何設置或重置Cookie,如何訪問它們,以及如何將它們刪除。
Servlet Cookie處理需要對中文進行編碼與解碼,方法如下:
String str=java.net.URLEncoder.encode("中文"); //編碼
String str=java.net.URLEncoder.decode("編碼後的字符串"); //解碼
Cookie剖析
Cookie通常設置在HTTP頭信息中(雖然JavaScript也可以直接在瀏覽器上設置一個Cookie)。設置Cookie的Servlet會發送如下的頭信息:
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=w3cschool.cc
Connection: close
Content-Type: text/html
正如你所看到的,Set-Cookie頭包含了一個名稱值對、一個GMT日期、一個路徑和一個域。名稱和值會被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
Servlet就能夠通過請求方法reuqest.getCookies()訪問Cookie,該方法將返回一個Cookie對象的數組。
Servlet Cookie 方法
以下是在Servlet中操作Cookie是可使用的有用的方法列表:
通過Servlet設置Cookie
通過Servlet設置Cookie包括三個步驟:
(1)創建一個Cookie對象:你可以調用帶有cookie名稱和cookie值的Cookie構造函數,cookie名稱和cookie值都是字符串。
Cookie cookie=new Cookie("key","value");
請記住,無論是名字還是值,都不應該包含空格或以下任何字符:
[ ] ( ) = , " / ? @ : ;
(2)設置最大生存週期:你可以使用setMaxAge方法來指定cookie能夠保持有效地時間(以秒爲單位)。下面將設置一個最長有效期爲24小時的cookie。
cookie.setMaxAge("60*60*24");
(3)發送Cookie到HTTP響應頭:你可以使用response.addCookie來添加HTTP響應頭中的Cookie,如下所示:
response.addCookie(cookie);
示例
讓我們修改我們的上次的表單數據實例,爲用戶名和密碼設置Cookie。
package com.JavaBean;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletCookie
*/
@WebServlet("/ServletCookie")
public class ServletCookie extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletCookie() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 爲用戶名和密碼創建 Cookie
Cookie name = new Cookie("name",URLEncoder.encode(request.getParameter("name"), "UTF-8")); // 中文轉碼
Cookie password = new Cookie("password",request.getParameter("password"));
// 爲兩個 Cookie 設置過期日期爲 24 小時後
name.setMaxAge(60*60*24);
password.setMaxAge(60*60*24);
// 在響應頭中添加兩個 Cookie
response.addCookie( name );
response.addCookie( password );
// 設置響應內容類型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "設置 Cookie 實例";
String docType = "<!DOCTYPE html>\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>用戶名:</b>:"
+ request.getParameter("name") + "\n</li>" +
" <li><b>密碼:</b>:"
+ request.getParameter("password") + "\n</li>" +
"</ul>\n" +
"</body></html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
編譯上面的Servlet ServletCookie.java程序,並在web.xml文件中創建適當的條目:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<!-- 類名 -->
<servlet-name>ServletCookie</servlet-name>
<!-- 所在的包 -->
<servlet-class>com.JavaBean.ServletCookie</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletCookie</servlet-name>
<!-- 訪問的網址 -->
<url-pattern>/TomcatTest/ServletCookie</url-pattern>
</servlet-mapping>
</web-app>
注意:不要有中文出現在web.xml文件中,這些中文需要刪除,否則tomcat會出錯。
最後嘗試用下面的HTML頁面來調用Servlet。
<!DOCTYPE html>
<html>
<head>
<meta charset="gb2312">
<title>Servlet處理cookie實例</title>
</head>
<body>
<form action="ServletCookie" method="POST">
用戶名 :<input type="text" name="name">
<br/>
密碼:<input type="text" name="password" /><br>
<input type="submit" value="提交" />
</form>
</body>
</html>
保存上面的內容到文件TomcatTest/UserType.html中。運行如下:
注意:以上的一些路徑需要根據你的項目的實際路徑進行修改。
通過Servlet讀取Cookie
要讀取cookie,你需要通過調用HttpServletRequest的getCookies()方法創建一個javax.servlet.http.Cookie對象的數組。然後循環遍歷數組,並使用getName()和getValue()方法來訪問每個cookie和關聯的值。
示例
讓我們讀取上面實例中設置的Cookie。