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

Servlet Cookie 处理

Les Cookie sont des fichiers texte stockés sur le computer client et conservent diverses informations de suivi. Java Servlet prend en charge显然 HTTP Cookie.

L'identification du retour de l'utilisateur comprend trois étapes :

  • Les scripts serveurs envoient un ensemble de Cookie au navigateur. Par exemple : nom, âge ou numéro d'identification, etc.

  • Le navigateur stocke ces informations sur l'ordinateur local pour une utilisation future.

  • Lorsque le navigateur envoie une nouvelle requête au serveur Web, il envoie ces informations de Cookie au serveur, qui utilise ces informations pour identifier l'utilisateur.

Ce chapitre vous expliquera comment configurer ou réinitialiser les Cookie, comment les accéder, et comment les supprimer.

Servlet Cookie traitement nécessite l'encodage et la décodage des caractères chinois, la méthode est la suivante :

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)
Cette méthode définit le domaine applicable au cookie, par exemple oldtoolbag.com.
2public String getDomain()
Cette méthode obtient le domaine applicable au cookie, par exemple oldtoolbag.com.
3public void setMaxAge(int expiry)
Cette méthode définit le temps d'expiration du cookie (en secondes). Si vous ne le définissez pas ainsi, le cookie ne restera valable que pendant la session actuelle.
4public int getMaxAge()
Cette méthode retourne la durée de vie maximale du cookie (en secondes), par défaut,-1 Indique que le cookie continuera jusqu'à ce que le navigateur soit fermé.
5public String getName()
Cette méthode retourne le nom du cookie. Le nom ne peut pas être modifié après sa création.
6public void setValue(String newValue)
Cette méthode définit la valeur associée au cookie.
7public String getValue()
Cette méthode obtient la valeur associée au cookie.
8public void setPath(String uri)
Cette méthode définit le chemin d'accès applicable au cookie. Si vous ne spécifiez pas de chemin, toutes les URL situées dans le répertoire courant (y compris les sous-répertoires) renverront le cookie.
9public String getPath()
Cette méthode obtient le chemin d'accès applicable au cookie.
10public void setSecure(boolean flag)
Cette méthode définit une valeur booléenne indiquant si le cookie doit être envoyé uniquement via une connexion cryptée (c'est-à-dire SSL).
11public void setComment(String purpose)
Définir le commentaire du cookie. Ce commentaire est très utile lorsque le navigateur présente le cookie à l'utilisateur.
12public String getComment()
Obtenir les commentaires du cookie, si le cookie n'a pas de commentaires, renvoie null.

Le paramétrage d'un cookie par Servlet

Le paramétrage d'un cookie par Servlet implique trois étapes :

(1) Créer un objet Cookie :Vous pouvez appeler le constructeur Cookie avec le nom du cookie et la valeur du cookie, le nom du cookie et la valeur du cookie sont tous deux des chaînes de caractères.

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

Rappelez-vous, que ce soit le nom ou la valeur, ils ne devraient pas contenir d'espaces ou de caractères suivants :

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

(2) Définir la durée de vie maximale :Vous pouvez utiliser la méthode setMaxAge pour spécifier le temps pendant lequel le cookie reste valide (en secondes). Voici un exemple de durée maximale de validité : 24 heures de cookie.

cookie.setMaxAge(60*60*24);

(3) pour envoyer un cookie dans l'en-tête de la réponse HTTP :Vous pouvez utiliser response.addCookie Pour ajouter un cookie dans l'en-tête de la réponse HTTP, comme suit :

response.addCookie(cookie);

Exemple en ligne

Modifions notre Exemple de données de formulaireDéfinir un cookie pour le nom et le prénom.

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;
/**
 * Classe d'implémentation Servlet HelloServlet
 */
@WebServlet("/HelloForm)
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-constructeur de Stub généré
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // Créer un cookie pour le nom et le prénom      
        Cookie name = new Cookie("name",
                URLEncoder.encode(request.getParameter("name"), "UTF-8"); // Codage de la langue chinoise
        Cookie url = new Cookie("url",
                      request.getParameter("url"));
        
        // Définir la date d'expiration pour les deux cookies à 24 heures après
        name.setMaxAge(60*60*24); 
        url.setMaxAge(60*60*24); 
        
        // Ajouter deux cookies dans l'en-tête de la réponse
        response.addCookie(name);
        response.addCookie(url);
        
        // Définir le type de contenu de la réponse
        response.setContentType("text/html;charset=UTF-8");
        
        PrintWriter out = response.getWriter();
        String title = "Exemple de configuration de Cookie";
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor="#f0f0f0">\n" +
                out.println(1 align="center">" + title + "</class="tutheader">No Cookie found<1>\n +
                <ul>
 +
                <li><b>Nom du site : </b> : "
                + request.getParameter("name") + /li>" +
                <li><b>URL du site : </b> : "
                + request.getParameter("url") + /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 HelloForm,并在 web.xml 文件中创建适当的条目:

<?xml version="1.0" encoding="UTF-8"?>
</web>-<app>
  </servlet> 
    <!-- 类名 -->  
    <servlet-name>HelloForm</<servlet>-name>
    <!-- 所在的包 -->
    <servlet-</class>com.w3codebox.test.HelloForm</<servlet>-<class>
  </</servlet>
  <servlet-<mapping>
    <servlet-name>HelloForm</<servlet>-name>
    <!-- 访问的网址 -->
    <url-<pattern>/TomcatTest/HelloForm</<url>-<pattern>
  </<servlet>-<mapping>
</<web>-<app>

最后尝试下面的 HTML 页面来调用 Servlet。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>基础教程网(oldtoolbag.com)</title>/<title>
</<head>
<body>
<form action="/TomcatTest/HelloForm" method="GET">
站点名:<input type="text" name="name">
<br />
站点 URL:<input type="text" name="url" /><br>
<input type="submit" value="提交" />
</form>
</body>
</html>

保存上面的 HTML 内容到文件 /TomcatTest/test.html 中。

接下来我们访问http://localhost:8080/TomcatTest/test.html,演示如下:

点击“提交”后,效果如下:

注意:以上的一些路径需要根据你项目实际路径修改。

通过 Servlet 读取 Cookie

要读取 Cookie,您需要通过调用 HttpServletRequestgetCookies() 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

Exemple en ligne

让我们读取上面示例中设置的 Cookie

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 implementation class ReadCookies
 */
@WebServlet("/ReadCookies)
public class ReadCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        super();
        // TODO Auto-constructeur de Stub généré
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // Obtenir un tableau de cookies associés à ce domaine
        cookies = request.getCookies();
         
         // Définir le type de contenu de la réponse
         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>Nom et valeur du cookie</class="tutheader">No Cookie found<2h
            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("Les cookies supprimés : ", + 
                                 out.print("参数名:" + }}/h
               }
               "<br" + out.print("参数名:" + cookie.getName( )
               ","); +  URLDecoder.decode(cookie.getValue(), "utf-8)") +cookie.getValue( )/h
            }
         "<br
             }else{
               out.println(2 "<h/class="tutheader">No Cookie found<2h
         }
         out.println("<body>";/>";
         out.println("<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 ReadCookieset créez l'entrée appropriée dans le fichier web.xml. Essayez de l'exécuter http://localhost:8080/TomcatTest/ReadCookies,将显示如下结果:


Supprimer un cookie via Servlet

Supprimer un cookie est très simple. Si vous souhaitez supprimer un cookie, suivez simplement les trois étapes suivantes :

  • Lisez un cookie existant et stockez-le dans l'objet Cookie.

  • Utilisez setMaxAge() La méthode réinitialise l'âge du cookie à zéro pour supprimer le cookie existant.

  • Ajoutez ce cookie à l'en-tête de la réponse.

Exemple en ligne

L'exemple suivant supprimera le cookie existant nommé "url", lorsque vous exécuterez à nouveau le Servlet ReadCookies, il renverra url comme null.

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 implementation class DeleteCookies
 */
@WebServlet("/DeleteCookies())
public class DeleteCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DeleteCookies() {
        super();
        // TODO Auto-constructeur de Stub généré
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // Obtenir un tableau de cookies associés à ce domaine
        cookies = request.getCookies();
        
            // Définir le type de contenu de la réponse
        response.setContentType("text/html;charset=UTF-8");
   
        PrintWriter out = response.getWriter();
        String title = "Exemple de suppression de 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>Nom et valeur du cookie</class="tutheader">No Cookie found<2h
           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("Les cookies supprimés : ", + 
                                out.print("参数名:" + }}/h
              }
              "<br" + out.print("参数名:" + cookie.getName( )
              ","); + out.print("参数值:"+cookie.getValue( )/h
           }
        "<br
            }else{
              out.println(2 "<h/class="tutheader">No Cookie found<2h
        }
        out.println("<body>";/>";
        out.println("<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 DeleteCookies,并在 web.xml 文件中创建适当的条目。现在运行 http://localhost:8080/TomcatTest/DeleteCookies,将显示如下结果: