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

Traitement des cookies JSP

Les cookies sont des fichiers texte stockés sur le client, qui contiennent de grandes quantités d'informations de trace. Sur la base de la technologie Servlet, JSP peut évidemment fournir un soutien pour les cookies HTTP.

Il y a généralement trois étapes pour identifier les clients fidèles :

  •             Les scripts serveur envoient une série de cookies au navigateur. Par exemple, le nom, l'âge, le numéro d'ID, etc.

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

  •             Lorsque le navigateur envoie une requête à un serveur la prochaine fois, il envoie également ces informations de cookie au serveur, puis le serveur utilise ces informations pour identifier l'utilisateur ou faire d'autres choses.

Cette section vous expliquera comment définir ou réinitialiser les cookies, comment y accéder et comment les supprimer.

Le traitement des cookies JSP nécessite l'encodage et le décodage des caractères chinois, voici la méthode :

String str = java.net.URLEncoder.encode("chinois", "UTF-8")-8);            //Codage
String str = java.net.URLDecoder.decode("chaine de caractères codée","UTF-8")-8);   // Décodage

Analyse de Cookie

Cookie 通常在 HTTP 信息头中设置(尽管 JavaScript 能够直接在浏览器中设置 cookie)。在 JSP 中,设置一个 cookie 需要发送如下信息头给服务器:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2015 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=w3codebox; expires=Friday, 04-Feb-17 22:03:38 GMT; 
                 path=/; domain=oldtoolbag.com
Connection: close
Content-Type: text/html

正正如您看到的,Set-Cookie 信息头包含一个键值对,一个 GMT(格林尼治标准)时间,一个路径,一个域名。键值对会被编码为 URL。有效期域是个指令,告诉浏览器在什么时候之后就可以清除这个 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

JSP 脚本通过 request 对象中的 getCookies() 方法来访问这些 cookie,这个方法会返回一个 Cookie 对象的数组。

    Servlet Cookie 方法

下表列出了 Cookie 对象中常用的方法:

序号方法 & 描述
                1public void setDomain(String pattern) 设置 cookie 的域名,比如 oldtoolbag.com
                2public String getDomain() 获取 cookie 的域名,比如 oldtoolbag.com
                3public void setMaxAge(int expiry) Définir la durée de validité du cookie, en secondes, par défaut, la durée de validité est la durée de vie de la session actuelle
                4public int getMaxAge() Obtenir la durée de validité du cookie, en secondes, par défaut :-1 Indiquer que le cookie vivra jusqu'à ce que le navigateur soit fermé
                5public String getName() Retourner le nom du cookie, une fois le nom créé, il ne peut pas être modifié
                6public void setValue(String newValue) Définir la valeur du cookie
                7public String getValue() Obtenir la valeur du cookie
                8public void setPath(String uri) Définir le chemin du cookie, par défaut pour tous les URL dans le répertoire courant et tous les sous-répertoires de ce répertoire
                9public String getPath() Obtenir le chemin du cookie
                10public void setSecure(boolean flag) Indiquer si le cookie doit être传输加密
                11public void setComment(String purpose) Définir la description du commentaire indiquant l'objectif du cookie. Les commentaires deviennent très utiles lorsque le navigateur affiche le cookie à l'utilisateur
                12public String getComment() Retourner les commentaires décrivant l'objectif du cookie, ou null si il n'y en a pas

Utiliser JSP pour définir un cookie

Utiliser JSP pour définir un cookie implique trois étapes :

(1) Créer un objet cookie : Appeler le constructeur du cookie avec un nom et une valeur en tant que paramètres, qui sont tous deux des chaînes de caractères.

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

Il est impératif de se souvenir que ni le nom ni la valeur ne peuvent contenir d'espaces ou des caractères tels que :

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

(2) Définir la durée de validité :Appeler la fonction setMaxAge() pour indiquer pendant combien de temps (en secondes) le cookie est valide. Les opérations suivantes ont fixé la durée de validité à : 24 heures.

cookie.setMaxAge(60*60*24);

(3) Envoyer le cookie à l'en-tête de réponse HTTP :Appeler la fonction response.addCookie() pour ajouter un cookie à l'en-tête de réponse HTTP.

response.addCookie(cookie);

Exemple de démonstration

Le code du fichier main.jsp est présenté comme suit :

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net."*" %>
<%
   // Encoding, résoudre les problèmes de caractères chinois malformés   
   String str = URLEncoder.encode(request.getParameter("name"),"utf-8);  
   // Définir les cookies name et url 
   Cookie name = new Cookie("name",
           str);
   Cookie url = new Cookie("url",
              request.getParameter("url"));
   // Définir la durée de validité des cookies à24heures.
   name.setMaxAge(60*60*24); 
   url.setMaxAge(60*60*24); 
   // Ajouter des cookies dans l'en-tête de la réponse
   response.addCookie(name);
   response.addCookie(url);
%>
<html>
<head>
<title>Définir les cookies</title>
</head>
<body>
<h1>Définir les cookies</h1>
<ul>
<li><p><b>Nom du site:</b>/b>
   <%= request.getParameter("name") %>
</p></li>
<li><p><b>URL:</b>/b>
   <%= request.getParameter("url") %>
</p></li>
</ul>
</body>
</html>

Voici un simple formulaire HTML qui soumet les données client au fichier main.jsp via la méthode GET et définit des cookies :

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Site de tutos de base(oldtoolbag.com)</title>
</head>
<body>
<form action="main.jsp" method=GET>
Nom du site: <input type="text" name="name">
<br />
URL: <input type="text" name="url" />
<input type="submit" value="Soumettre" />
</form>
</body>
</html>

Enregistrer le code HTML ci-dessus dans le fichier test.htm.

Placez ce fichier dans le répertoire WebContent du projet jsp actuel (dans le même répertoire que main.jsp).

En accédant à http://localhost:8080/testjsp/Soumettre les données du formulaire test.html au fichier main.jsp comme suit :

Essayer d'entrer "nom du site" et "URL", puis cliquer sur le bouton de soumission, il affichera "nom du site" et "URL" sur votre écran et définira deux cookies pour "nom du site" et "URL".

Lire le Cookie en utilisant JSP

Pour lire un cookie, vous devez appeler la méthode request.getCookies() pour obtenir un tableau d'objets javax.servlet.http.Cookie, puis parcourir ce tableau, utiliser les méthodes getName() et getValue() pour obtenir le nom et la valeur de chaque cookie.

Exemple de démonstration

Lisons les cookies de l'exemple précédent, voici le code du fichier cookie.jsp :

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net."*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Obtenir le Cookie</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Obtenir les données des cookies, c'est un tableau
   cookies = request.getCookies();
   if( cookies != null ) {
      out.println("<h2> Recherche du nom et de la valeur du Cookie/h2)");
      for (int i = 0; i < cookies.length; i++}
         cookie = cookies[i];
        
         out.print("Nom du paramètre: ") + cookie.getName());
         out.print("<br>");
         out.print("Valeur du paramètre: ") + -8) +"	<br>"
         out.print("------------------------------------<br>
      }
  }
      out.println("<h2>Aucun Cookie trouvé</h2)");
  }
%>
</body>
</html>

Après l'accès du navigateur, le résultat de la sortie est :

    Suppression de cookie en utilisant JSP

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

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

  •             Définissez la durée de validité du cookie sur 0.

  •             Ajoutez ce cookie à nouveau dans l'entête de la réponse.

Exemple de démonstration

Le programme suivant supprime un cookie nommé "name", lorsque vous exécutez cookie.jsp pour la deuxième fois, name sera null.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net."*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Obtenir le Cookie</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Obtenir les cookies du domaine actuel, c'est un tableau
   cookies = request.getCookies();
   if( cookies != null ) {
      out.println("<h2> Recherche du nom et de la valeur du 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("Suppression du Cookie: ") + 
            cookie.getName( ) + "<br/)");
         }
         out.print("Nom du paramètre: ") + cookie.getName());
         out.print("<br>");
         out.print("Valeur du paramètre: ") + -8) +"	<br>"
         out.print("------------------------------------<br>
      }
  }
      out.println("<h2>Aucun Cookie trouvé</h2)");
  }
%>
</body>
</html>

Accédez via le navigateur, le résultat est :

Accédez à nouveau à http://localhost:8080/testjsp/cookie.jsp, vous obtiendrez le résultat suivant :

Vous pouvez voir que le cookie nommé "name" a disparu.

Vous pouvez également supprimer manuellement les cookies dans le navigateur. Dans Internet Explorer, cliquez sur l'élément Menu Outils, puis choisissez Options Internet, cliquez sur Supprimer les cookies, et vous pouvez supprimer tous les cookies.