English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Servlet Cookie Handling

Cookies sind Textdateien, die auf dem Clientcomputer gespeichert sind und verschiedene Tracking-Informationen enthalten. Java Servlet unterstützt显然 HTTP Cookies.

Die Identifizierung des zurückgegebenen Benutzers umfasst drei Schritte:

  • Der Server-Skript sendet eine Gruppe von Cookies an den Browser. Zum Beispiel: Name, Alter oder Identifikationsnummer usw.

  • Der Browser speichert diese Informationen auf dem lokalen Computer, um sie für zukünftige Verwendung bereitzustellen.

  • Wenn der Browser das nächste Mal eine Anfrage an den Webserver sendet, sendet der Browser diese Cookie-Informationen an den Server, der diese Informationen verwendet, um den Benutzer zu identifizieren.

Dieses Kapitel wird Ihnen erläutern, wie Sie Cookies einrichten oder zurücksetzen, wie Sie auf sie zugreifen und wie Sie sie löschen können.

Servlet Cookie Verarbeitungsprozess erfordert die Kodierung und Dekodierung von chinesischen Zeichen, wie folgt:

String 	str	=	java.net.URLEncoder.encode("中文", "UTF")-8");            //编码
String str = java.net.URLDecoder.decode("编码后的字符串","UTF"-8");   // 解码

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=oldtoolbag.com
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 可以通过请求方法 request.getCookies() 访问 Cookie,该方法将返回一个 Cookie 对象的数组。

Servlet Cookie 方法

以下是在 Servlet 中操作 Cookie 时可使用的一些有用方法列表。

序号方法 & 描述
1public void setDomain(String pattern)
Diese Methode stellt den für das Cookie geltenden Domain ein, z.B. oldtoolbag.com.
2public String getDomain()
Diese Methode gibt den für das Cookie geltenden Domain zurück, z.B. oldtoolbag.com.
3public void setMaxAge(int expiry)
Diese Methode stellt die Ablaufzeit des Cookies (in Sekunden) ein. Wenn dies nicht eingestellt wird, bleibt der Cookie nur im aktuellen Sitzungsvorgang gültig.
4public int getMaxAge()
Diese Methode gibt die maximale Lebensdauer des Cookies (in Sekunden) zurück, Standardmäßig,-1 Das bedeutet, dass der Cookie bis zum Schließen des Browsers bestehen bleibt.
5public String getName()
Diese Methode gibt den Namen des Cookies zurück. Der Name kann nach der Erstellung nicht geändert werden.
6public void setValue(String newValue)
Diese Methode stellt den mit dem Cookie verbundenen Wert ein.
7public String getValue()
Diese Methode gibt den mit dem Cookie verbundenen Wert zurück.
8public void setPath(String uri)
Diese Methode stellt den für das Cookie geltenden Pfad ein. Wenn Sie den Pfad nicht angeben, werden alle URLs im gleichen Verzeichnis des aktuellen Seitenverzeichnisses (einschließlich der Unterverzeichnisse) den Cookie zurückgeben.
9public String getPath()
Diese Methode gibt den für das Cookie geltenden Pfad zurück.
10public void setSecure(boolean flag)
Diese Methode stellt einen Boolean-Wert ein, der angibt, ob das Cookie nur über verschlüsselte (d.h. SSL) Verbindungen gesendet werden sollte.
11public void setComment(String purpose)
Den Kommentar des Cookies einstellen. Dieser Kommentar ist sehr nützlich, wenn der Browser den Cookie dem Benutzer darstellt.
12public String getComment()
Den Kommentar des Cookies abrufen, falls der Cookie keinen Kommentar hat, wird null zurückgegeben.

Cookie durch Servlet einstellen

Die Cookie-Einstellung durch Servlet umfasst drei Schritte:

(1) Ein Cookie-Objekt erstellen:Sie können die Cookie-Konstruktorfunktion mit dem Cookie-Namen und dem Cookie-Wert aufrufen, sowohl der Cookie-Namen als auch der Cookie-Werte sind Zeichenfolgen.

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);

Online-Beispiel

让我们修改我们的 表单数据示例,为名字和姓氏设置 Cookie。

package com.w3codebox.test;
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 HelloServlet
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        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 url = new Cookie("url",
                      request.getParameter("url"));
        
        // 为两个 Cookie 设置过期日期为 24 小时后
        name.setMaxAge(60*60*24); 
        url.setMaxAge(60*60*24); 
        
        // 在响应头中添加两个 Cookie
        response.addCookie( name );
        response.addCookie( url );
        
        // 设置响应内容类型
        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>站点 URL:</b>:"
                + request.getParameter("url") + "\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);
    }
}

Compile the above Servlet HelloFormund erstellen Sie einen geeigneten Eintrag im web.xml-Datei:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet 
    <!-- Klassenname -->  
    <servlet-name>HelloForm</servlet-name>
    <!-- im Paket -->
    <servlet-class>com.w3codebox.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <!-- Besuchte Website -->
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

Versuchen Sie am Ende, die folgende HTML-Seite aufzurufen, um Servlet aufzurufen.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Grundlagen-Tutorial-Website(oldtoolbag.com)</title>/title>
</head>
<body>
<form action="/TomcatTest/HelloForm" method="GET">
Website-Name:<input type="text" name="name">
<br />
Website-URL:<input type="text" name="url" /><br>
<input type="submit" value="Absenden"> />
</form>
</body>
</html>

Speichern Sie den obigen HTML-Inhalt in einer Datei /TomcatTest/test.html.

Als nächstes besuchen wir http://localhost:8080/TomcatTest/test.html, wie folgt gezeigt:

Nach dem Klicken auf "Absenden" ist die Wirkung wie folgt:

Hinweis:Einige der obigen Pfade müssen entsprechend dem tatsächlichen Pfad Ihres Projekts geändert werden.

Cookie durch Servlet lesen

Um Cookie zu lesen, müssen Sie durch Aufruf HttpServletRequest von getCookies( ) Methode erstellt eine javax.servlet.http.Cookie Objekt-Array. Dann durchlaufen Sie den Array in einer Schleife und verwenden Sie getName() und getValue(), um jeden Cookie und den zugehörigen Wert abzurufen.

Online-Beispiel

Lassen Sie uns die Cookie lesen, die im obigen Beispiel eingerichtet wurden

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
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 Implementierungsklasse ReadCookies
 */
@WebServlet("/ReadCookies)
public class ReadCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        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 = null;
        Cookie[] cookies = null;
        // 获取与该域相关的 Cookie 的数组
        cookies = request.getCookies();
         
         // 设置响应内容类型
         response.setContentType("text/html;charset=UTF-8");
    
         PrintWriter out = response.getWriter();
         String title = "Delete Cookie Example";
         String docType = "<!DOCTYPE html>\n";
         out.println(docType +
                   "<html>\n" +
                   "<head><title>" + title + "</title></head>\n" +
                   "<body bgcolor=\"#f0f0f0\">\n" );
          if( cookies != null ){
            out.println("<h2>Cookie 名称和值</h2>");
            for (int i = 0; i < cookies.length; i++{
               cookie = cookies[i];
               if((cookie.getName()).compareTo("name") == 0 ){
                    cookie.setMaxAge(0);
                    response.addCookie(cookie);
                    out.print("已删除的 cookie:") + 
                                 cookie.getName( ) + "<br}}/>");
               }
               out.print("Parameter name: " + cookie.getName( ) + ",");
               out.print("Parameter value: " +  URLDecoder.decode(cookie.getValue(), "utf-8)") +"<br/>");
            }
         }else{
             out.println(
               "<h2 class="tutheader">No Cookie founds</h2>");
         }
         out.println("</body>");
         out.println("</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);
    }
}

Compile the above Servlet ReadCookies, und erstellen Sie im Datei web.xml die entsprechenden Einträge. Versuchen Sie, auszuführen http://localhost:8080/TomcatTest/ReadCookiesThe following result will be displayed:


Durch Servlet löschen

Das Löschen eines Cookies ist sehr einfach. Wenn Sie ein Cookie löschen möchten, müssen Sie nur die folgenden drei Schritte ausführen:

  • Lesen Sie ein vorhandenes Cookie aus und speichern Sie es im Cookie-Objekt.

  • Verwenden Sie setMaxAge() Die Methode setzt das Alter des Cookies auf Null, um bestehende Cookies zu löschen.

  • Fügen Sie dieses Cookie zum Antwortkopf hinzu.

Online-Beispiel

Das folgende Beispiel wird das vorhandene Cookie mit dem Namen "url" löschen. Wenn Sie den Servlet ReadCookies beim nächsten Mal ausführen, wird url als null zurückgegeben.

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
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 Implementierungsklasse DeleteCookies
 */
@WebServlet("/DeleteCookies)
public class DeleteCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DeleteCookies() {
        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 = null;
        Cookie[] cookies = null;
        // 获取与该域相关的 Cookie 的数组
        cookies = request.getCookies();
        
            // 设置响应内容类型
        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" );
         if( cookies != null ){
           out.println("<h2>Cookie 名称和值</h2>");
           for (int i = 0; i < cookies.length; i++{
              cookie = cookies[i];
              if((cookie.getName( )).compareTo("url") == 0 ){
                   cookie.setMaxAge(0);
                   response.addCookie(cookie);
                   out.print("已删除的 cookie:") + 
                                cookie.getName( ) + "<br}}/>");
              }
              out.print("Parameter name: " + cookie.getName( ) + ",");
              out.print("Parameter value: " + cookie.getValue( )+"<br/>");
           }
        }else{
            out.println(
              "<h2 class="tutheader">No Cookie founds</h2>");
        }
        out.println("</body>");
        out.println("</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);
    }
}

Compile the above Servlet DeleteCookiesCreate an appropriate entry in the web.xml file. Now run http://localhost:8080/TomcatTest/DeleteCookiesThe following result will be displayed: