Gestion des cookies de servlets


Les cookies sont des fichiers texte stockés sur l'ordinateur du client et conservent diverses informations de suivi. Les servlets Java prennent apparemment en charge les cookies HTTP.

L'identification des utilisateurs connus implique trois étapes :

  • Le script du serveur envoie un ensemble de cookies au navigateur. Par exemple : nom, âge ou numéro d'identification, etc.

  • Le navigateur stocke ces informations localement sur votre ordinateur pour une utilisation ultérieure.

  • La prochaine fois que le navigateur enverra une demande au serveur Web, le navigateur enverra ces informations sur les cookies au serveur, et le serveur utilisera ces informations pour identifier l'utilisateur.

Ce chapitre vous apprendra comment définir ou réinitialiser les cookies, comment y accéder et comment les supprimer.

Anatomie des cookies

Les cookies sont généralement définis dans les en-têtes HTTP (bien que JavaScript puisse également définir un cookie directement sur le navigateur). La servlet qui définit le cookie enverra les informations d'en-tête suivantes :

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

Comme vous pouvez le voir, l'en-tête Set-Cookie contient une paire nom-valeur, une date GMT, un chemin et un domaine. Les noms et les valeurs seront codés en URL. Le champ expire est une instruction qui indique au navigateur « d’oublier » le cookie après une heure et une date données.

Si votre navigateur est configuré pour stocker des cookies, il conservera ces informations jusqu'à la date d'expiration. Si le navigateur de l'utilisateur pointe vers une page correspondant au chemin et au domaine du cookie, il renvoie le cookie au serveur. Les informations d'en-tête du navigateur peuvent ressembler à ce qui suit :

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 peut accéder à Cookie via la méthode de requête request.getCookies(), qui renverra un Cookie tableau d'objets.

Méthodes de cookies de servlet

Ce qui suit est une liste de méthodes utiles qui peuvent être utilisées lors de la manipulation de cookies dans un servlet.

序号方法 & 描述
1public void setDomain(String pattern)
该方法设置 cookie 适用的域,例如 w3cschool.cc。
2public String getDomain()
该方法获取 cookie 适用的域,例如 w3cschool.cc。
3public void setMaxAge(int expiry)
该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
4public int getMaxAge()
该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
5public String getName()
该方法返回 cookie 的名称。名称在创建后不能改变。
6public void setValue(String newValue)
该方法设置与 cookie 关联的值。
7public String getValue()
该方法获取与 cookie 关联的值。
8public void setPath(String uri)
该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
9public String getPath()
该方法获取 cookie 适用的路径。
10public void setSecure(boolean flag)
该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
11public void setComment(String purpose)
该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
12public String getComment()
该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。

Définir les cookies via servlet

La configuration des cookies via servlet comprend trois étapes :

(1) Créez un objet Cookie : Vous pouvez appeler avec le constructeur Cookie avec le nom du cookie et la valeur du cookie, le nom du cookie et la valeur du cookie sont des chaînes.

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

N'oubliez pas que ni le nom ni la valeur ne doivent contenir d'espaces ou l'un des caractères suivants :

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

(2) Définissez la durée de vie maximale : Vous pouvez utiliser setMaxAge méthode pour spécifier combien de temps (en secondes) le cookie reste valide. Ce qui suit installera un cookie d’une durée de validité maximale de 24 heures.

cookie.setMaxAge(60*60*24);

(3) Envoyer le cookie à l'en-tête de réponse HTTP : Vous pouvez utiliser response.addCookie pour ajouter des cookies dans l'en-tête de réponse HTTP, comme indiqué ci-dessous :

response.addCookie(cookie);

Exemple

Modifions notre instance de données de formulaire pour définir des cookies pour le prénom et le nom.

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class HelloForm extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 为名字和姓氏创建 Cookies      
      Cookie firstName = new Cookie("first_name",
                      request.getParameter("first_name"));
      Cookie lastName = new Cookie("last_name",
                      request.getParameter("last_name"));

      // 为两个 Cookies 设置过期日期为 24 小时后
      firstName.setMaxAge(60*60*24); 
      lastName.setMaxAge(60*60*24); 

      // 在响应头中添加两个 Cookies
      response.addCookie( firstName );
      response.addCookie( lastName );

      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "设置 Cookies 实例";
      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>名字</b>:"
                + request.getParameter("first_name") + "\n</li>" +
                "  <li><b>姓氏</b>:"
                + request.getParameter("last_name") + "\n</li>" +
                "</ul>\n" +
                "</body></html>");
  }
}

Compilez le servlet ci-dessus HelloForm et créez les entrées appropriées dans le fichier web.xml et enfin essayez la page HTML suivante pour appeler le servlet.

 <html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<form action="HelloForm" method="GET">
名字:<input type="text" name="first_name">
<br />
姓氏:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>
</body>
</html>

Enregistrez le contenu HTML ci-dessus dans le fichier hello.htm et placez-le dans le répertoire <Tomcat-installation-directory>/webapps/ROOT. Lorsque vous visitez http://localhost:8080/Hello.htm, le résultat réel du formulaire ci-dessus ressemble à ceci :

Essayez de saisir votre prénom et votre nom. , puis cliquez sur le bouton « Soumettre », le prénom et le nom seront affichés à l'écran, et les deux cookies firstName et lastName seront définis. Lorsque vous appuierez la prochaine fois sur le bouton Soumettre, ces deux cookies seront retransférés vers. le serveur.

La section suivante explique comment accéder à ces cookies dans les applications Web.

Lecture des cookies via Servlet

Pour lire les cookies, vous devez créer un javax en appelant la méthode getCookies() de HttpServletRequest Tableau d'objets .servlet.http.Cookie. Ensuite, il parcourt le tableau et accède à chaque cookie et à la valeur associée à l'aide des méthodes getName() et getValue().

Instance

Lisons les cookies définis dans l'instance ci-dessus

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class ReadCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      // 获取与该域相关的 Cookies 的数组
      cookies = request.getCookies();
      
      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      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>查找 Cookies 名称和值</h2>");
         for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];
            out.print("名称:" + cookie.getName( ) + ",");
            out.print("值:" + cookie.getValue( )+" <br/>");
         }
      }else{
          out.println("<h2>未找到 Cookies</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Compilons le servlet ci-dessus ReadCookies et dans le fichier web.xml Créez le entrées. Si vous avez défini le cookie prénom sur "John" et le cookie nom sur "Joueur" et essayez d'exécuter http://localhost:8080/ReadCookies, les résultats suivants s'afficheront :

< table class=" src" style="background-color: #f7f7f7;border: 1px solid #d6d6d6;border-collapse: effondrement;largeur: 100%;">

查找 Cookies 名称和值

名称:first_name,值:John
名称:last_name,值:Player
Rechercher le nom et la valeur des cookies <🎜>Nom : prénom, valeur : John <🎜>Nom : nom de famille, valeur : Joueur

Supprimer les cookies via Servlet

Supprimer les cookies est très simple. Si vous souhaitez supprimer un cookie, il vous suffit alors de suivre ces trois étapes :

  • Lire un cookie existant et le stocker dans l'objet Cookie.

  • Supprimez les cookies existants en définissant l'âge du cookie à zéro à l'aide de la méthode setMaxAge().

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

Exemple

L'exemple suivant supprimera le cookie existant nommé "first_name", et lorsque vous exécuterez la prochaine fois le servlet ReadCookies, il renverra first_name comme valeur NULL.

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class DeleteCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      // 获取与该域相关的 Cookies 的数组
      cookies = request.getCookies();
      
	  // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      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 名称和值</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("已删除的 cookie:" + 
                              cookie.getName( ) + "<br/>");
            }
            out.print("名称:" + cookie.getName( ) + ",");
            out.print("值:" + cookie.getValue( )+" <br/>");
         }
      }else{
          out.println(
            "<h2 class="tutheader">No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Compilez le servlet ci-dessus DeleteCookies et créez les entrées appropriées dans le fichier web.xml. Exécutez maintenant http://localhost:8080/DeleteCookies et les résultats suivants seront affichés :

Cookies 名称和值

已删除的 cookie:first_name
名称:first_name,值:John
名称:last_name,值:Player
Nom : last_name, Valeur : Player

Essayez maintenant d'exécuter http://localhost:8080/ReadCookies , il affichera uniquement un cookie comme celui-ci :

查找 Cookies 名称和值

名称:last_name,值:Player
Rechercher le nom et la valeur des cookies

Nom : nom de famille, valeur : Joueur

Vous pouvez supprimer manuellement les cookies dans Internet Explorer. Dans le menu "Outils", sélectionnez "Options Internet". Si vous souhaitez supprimer tous les cookies, cliquez sur « Supprimer les cookies ».
<🎜>