Servlets - Gestion des cookies

Les cookies sont des fichiers texte stockés sur l'ordinateur client et ils sont conservés à diverses fins de suivi des informations. Les servlets Java prennent en charge de manière transparente les cookies HTTP.

Il y a trois étapes pour identifier les utilisateurs qui reviennent -

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

  • Le navigateur stocke ces informations sur la machine locale pour une utilisation future.

  • La prochaine fois que le navigateur envoie une demande au serveur Web, il envoie ces informations sur les cookies au serveur et le serveur utilise 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.

L'anatomie d'un cookie

Les cookies sont généralement définis dans un en-tête HTTP (bien que JavaScript puisse également définir un cookie directement sur un navigateur). Un servlet qui définit un cookie peut envoyer des en-têtes qui ressemblent à ceci -

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

Comme vous pouvez le voir, l'en-tête Set-Cookie contient une paire de valeur de nom, une date GMT, un chemin et un domaine. Le nom et la valeur seront encodés en URL. Le champ expire est une instruction au navigateur pour "oublier" le cookie après l'heure et la date données.

Si le navigateur est configuré pour stocker des cookies, il conservera alors ces informations jusqu'à la date d'expiration. Si l'utilisateur pointe le navigateur sur une page qui correspond au chemin et au domaine du cookie, il renverra le cookie au serveur. Les en-têtes du navigateur peuvent ressembler à ceci -

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

Un servlet aura alors accès au cookie via la méthode de requête request.getCookies () qui retourne un tableau d' objets Cookie .

Méthodes de cookies de servlet

Voici la liste des méthodes utiles que vous pouvez utiliser lors de la manipulation des cookies dans le servlet.

Sr.No. Méthode et description
1

public void setDomain(String pattern)

Cette méthode définit le domaine auquel s'applique le cookie, par exemple tutorialspoint.com.

2

public String getDomain()

Cette méthode obtient le domaine auquel s'applique le cookie, par exemple tutorialspoint.com.

3

public void setMaxAge(int expiry)

Cette méthode définit la durée (en secondes) qui doit s'écouler avant l'expiration du cookie. Si vous ne définissez pas cela, le cookie ne durera que pour la session en cours.

4

public int getMaxAge()

Cette méthode renvoie l'âge maximum du cookie, spécifié en secondes. Par défaut, -1 indique que le cookie persistera jusqu'à l'arrêt du navigateur.

5

public String getName()

Cette méthode renvoie le nom du cookie. Le nom ne peut pas être modifié après la création.

6

public void setValue(String newValue)

Cette méthode définit la valeur associée au cookie

sept

public String getValue()

Cette méthode obtient la valeur associée au cookie.

8

public void setPath(String uri)

Cette méthode définit le chemin auquel ce cookie s'applique. Si vous ne spécifiez pas de chemin, le cookie est renvoyé pour toutes les URL dans le même répertoire que la page actuelle ainsi que pour tous les sous-répertoires.

9

public String getPath()

Cette méthode obtient le chemin auquel ce cookie s'applique.

dix

public void setSecure(boolean flag)

Cette méthode définit la valeur booléenne indiquant si le cookie doit être envoyé uniquement via des connexions cryptées (c'est-à-dire SSL).

11

public void setComment(String purpose)

Cette méthode spécifie un commentaire qui décrit le but d'un cookie. Le commentaire est utile si le navigateur présente le cookie à l'utilisateur.

12

public String getComment()

Cette méthode retourne le commentaire décrivant l'objectif de ce cookie, ou null si le cookie n'a pas de commentaire.

Configurer les cookies avec Servlet

La configuration des cookies avec servlet implique trois étapes -

(1) Creating a Cookie object - Vous appelez le constructeur Cookie avec un nom de cookie et une valeur de cookie, qui sont tous deux des chaînes.

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

Gardez à l'esprit que ni le nom ni la valeur ne doivent contenir d'espaces blancs ou l'un des caractères suivants -

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

(2) Setting the maximum age- Vous utilisez setMaxAge pour spécifier la durée (en secondes) du cookie doit être valide. La suite mettrait en place un cookie pendant 24 heures.

cookie.setMaxAge(60 * 60 * 24);

(3) Sending the Cookie into the HTTP response headers - Vous utilisez response.addCookie pour ajouter des cookies dans l'en-tête de réponse HTTP comme suit -

response.addCookie(cookie);

Exemple

Modifions notre exemple de formulaire pour définir les cookies pour le prénom et le nom.

// 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>"
      );
   }
}

Compilez le servlet ci-dessus HelloForm et créez l'entrée appropriée dans le fichier web.xml et essayez enfin de suivre la page HTML pour appeler le 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>

Conservez le contenu HTML au-dessus dans un fichier Hello.htm et placez-le dans le répertoire <Tomcat-installationdirectory> / webapps / ROOT. Lorsque vous accéderez à http: // localhost: 8080 / Hello.htm , voici la sortie réelle du formulaire ci-dessus.

Essayez d'entrer le prénom et le nom, puis cliquez sur le bouton Soumettre. Cela afficherait le prénom et le nom sur votre écran et en même temps cela définirait deux cookies firstName et lastName qui seraient renvoyés au serveur la prochaine fois que vous appuyez sur le bouton Soumettre.

La section suivante vous explique comment accéder à ces cookies dans votre application Web.

Lire les cookies avec Servlet

Pour lire les cookies, vous devez créer un tableau d' objets javax.servlet.http.Cookie en appelant legetCookies()méthode de HttpServletRequest . Parcourez ensuite le tableau et utilisez les méthodes getName () et getValue () pour accéder à chaque cookie et à la valeur associée.

Exemple

Lisons les cookies que nous avons définis dans l'exemple précédent -

// 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>");
   }
}

Compiler au-dessus du servlet ReadCookieset créez l'entrée appropriée dans le fichier web.xml. Si vous aviez défini le cookie first_name sur "John" et le cookie last_name sur "Player", alors exécuter http: // localhost: 8080 / ReadCookies afficherait le résultat suivant -

Found Cookies Name and Value

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

Supprimer les cookies avec Servlet

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

  • Lisez un cookie déjà existant et stockez-le dans l'objet Cookie.

  • Définir l'âge des cookies sur zéro en utilisant setMaxAge() méthode pour supprimer un cookie existant

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

Exemple

L'exemple suivant supprimerait le cookie existant nommé "first_name" et lorsque vous exécuteriez le servlet ReadCookies la prochaine fois, il renverrait une valeur nulle pour 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
      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>");
   }
}

Compiler au-dessus du servlet DeleteCookieset créez l'entrée appropriée dans le fichier web.xml. Maintenant, exécutant http: // localhost: 8080 / DeleteCookies afficherait le résultat suivant -

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Maintenant, essayez d'exécuter http: // localhost: 8080 / ReadCookies et il n'afficherait qu'un seul cookie comme suit -

Found Cookies Name and Value

Name : last_name, Value: Player

Vous pouvez supprimer manuellement vos cookies dans Internet Explorer. Démarrez dans le menu Outils et sélectionnez Options Internet. Pour supprimer tous les cookies, appuyez sur Supprimer les cookies.