Servlet cookies處理

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,你需要通過調用HttpServletRequestgetCookies()方法創建一個javax.servlet.http.Cookie對象的數組。然後循環遍歷數組,並使用getName()getValue()方法來訪問每個cookie和關聯的值。

示例

讓我們讀取上面實例中設置的Cookie。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章