當前位置:首頁 » Servlets » Servlet Cookies處理

Servlet Cookies處理

Servlets Cookies處理實例代碼 - Cookie是存儲在客戶端計算機上的文本文件,並保留了它們的各種信息跟蹤的目的。 Java Servlet透明支持HTTP Cookie。

Cookie是存儲在客戶端計算機上的文本文件,並保留了它們的各種信息跟蹤的目的。 Java Servlet透明支持HTTP Cookie。

涉及標識返回用戶有三個步驟:

  • 服務器腳本發送到瀏覽器的一組cookie。對於如: 姓名,年齡,或識彆號碼等。

  • 瀏覽器將這些信息存儲在本地計算機上,以備將來使用。

  • 下一次瀏覽器發送任何請求,Web服務器,然後這些cookie發送信息到服務器,服務器將使用這些信息來識彆用戶。

本章將教你如何設置或重置cookie,如何訪問它們,以及如何將它們刪除。

Cookie 剖析:

Cookies通常設置在HTTP頭(雖然JavaScript也可以直接在瀏覽器上設置一個cookie)。servlet也可以設置一個cookie發送標頭,看起來像這樣:

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頭包含一個名稱值對,時間日期,路徑和域。將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就能夠訪問的cookie通過請求方法request.getCookies()返回一個Cookie對象數組。

Servlet Cookies 方法:

以下是有用的方法列表時,可以使用servlet操縱cookies。

S.N. Method & Description
1 public void setDomain(String pattern)
這個方法設置域的cookie適用,例如www.gitbook.net
2 public String getDomain()
此方法獲取域的cookie應用,例如gitbook.net
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的路徑。如果你不指定路徑,Cookie是相同的目錄以及當前頁麵的所有子目錄中的所有URL返回。
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用途或者為null,如果cookie冇有注釋。

使用Servlet設置Cookie:

設置Cookie的servlet包括三個步驟:

(1) 創建一個Cookie對象:cookie的名稱和cookie的值,這兩個都是字符串調用Cookie的構造函數。

Cookie cookie = new Cookie("key","value");

請記住,無論是名字,也不值應該包含空格或以下任何字符:

[ ] ( ) = , " / ? @ : ;

(2) 設置將最長生存期:可以使用setMaxAge方法到指定多長時間(以秒為單位),在這時間內cookie應該是有效的。以下將成立一個24小時的cookie。

cookie.setMaxAge(60*60*24); 

(3) HTTP響應頭的Cookie發送到:使用response.addCookie添加cookie的HTTP響應頭如下:

response.addCookie(cookie);

例子:

讓我們修改我們的表格示例,設置第一個和最後一個名字的Cookie

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class HelloForm extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // Create cookies for first and last names.      
      Cookie firstName = new Cookie("first_name",
                      request.getParameter("first_name"));
      Cookie lastName = new Cookie("last_name",
                      request.getParameter("last_name"));

      // Set expiry date after 24 Hrs for both the cookies.
      firstName.setMaxAge(60*60*24); 
      lastName.setMaxAge(60*60*24); 

      // Add both the cookies in the response header.
      response.addCookie( firstName );
      response.addCookie( lastName );

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Setting Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\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>First Name</b>: "
                + request.getParameter("first_name") + "\n" +
                "  <li><b>Last Name</b>: "
                + request.getParameter("last_name") + "\n" +
                "</ul>\n" +
                "</body></html>");
  }
}

編譯以上servlet 的 HelloForm和在web.xml文件中創建相應的條目,最後嘗試下麵的HTML頁麵調用servlet。

 
<html>
<body>
<form action="HelloForm" method="GET">
First Name: <input type="text" name="first_name">
<br />
Last Name: <input type="text" name="last_name" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

保存上述文件為hello.htm,並把它放在<Tomcat-installation-directory>/webapps/ROOT/目錄中HTML內容。

嘗試輸入First Name和Last Name,然後單擊“提交”按鈕。這將顯示在屏幕上,同時設置兩個cookie將被傳遞回服務器,您需要按“提交”按鈕時,下一次的firstName和lastName姓氏和名字。
下一節會解釋,如何在Web應用程序中訪問這些Cookie的備份。


使用Servlet讀取Cookie:

要讀取Cookie,您需要創建一個一係列的javax.servlet.http.Cookie對象調用HttpServletRequest的getCookies()方法。然後循環數組,和使用的getName()和getValue()方法來訪問每個cookie和關聯的值。

例子:

讓我們讀取cookie,我們已經在前麵的例子中:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class ReadCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();
      
	  // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Reading Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
      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>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

編譯以上servlet的ReadCookies,並在web.xml文件中創建相應的條目。如果你想有first_name為“John”和last_name的“Player”的cookie的cookie,然後運行http://localhost:8080/ReadCookies將顯示以下結果:

Found Cookies Name and Value

Name : first_name, Value: John 
Name : last_name, Value: Player

使用Servlet刪除Cookies:

刪除cookie是非常簡單的。如果你想刪除一個cookie,那麼你隻需要遵循以下三個步驟:

  1. 閱讀一個已經存在的cookie,並將其存儲在Cookie對象。

  2. 設置cookie的年齡為零,通過setMaxAge()方法來刪除現有的cookie。

  3. 將這個Cookie添加到響應頭。

例子:

下麵的例子將刪除現有的cookie名為“first_name”,當你將運行ReadCookies的servlet,下一次它會返回空值first_name。

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class DeleteCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();
      
	  // Set response content type -by www.gitbook.net
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
       if( cookies != null ){
         out.println("<h2> 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>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

編譯以上DeleteCookies 配置servlet ,並在web.xml文件中創建相應的條目。

現在運行http://localhost:8080/DeleteCookies將顯示如下的結果:

Cookies Name and Value

Deleted cookie : first_name
Name : first_name, Value: John
Name : last_name, Value: Player

現在嘗試運行http://localhost:8080/ReadCookies ,它會顯示一個cookie如下:

Found Cookies Name and Value

Name : last_name, Value: Player

您可以手動在Internet Explorer中刪除Cookie。在“工具”菜單,選擇“Internet選項”。要刪除所有Cookie,按“刪除Cookies”。