Servlet - Gestione dei cookie

I cookie sono file di testo memorizzati sul computer client e vengono conservati per vari scopi di tracciamento delle informazioni. Java Servlet supporta in modo trasparente i cookie HTTP.

Ci sono tre passaggi coinvolti nell'identificazione degli utenti di ritorno:

  • Lo script del server invia una serie di cookie al browser. Ad esempio nome, età o numero di identificazione ecc.

  • Il browser memorizza queste informazioni sulla macchina locale per un utilizzo futuro.

  • La volta successiva che il browser invia una richiesta al server Web, invia tali informazioni sui cookie al server e il server utilizza tali informazioni per identificare l'utente.

Questo capitolo ti insegnerà come impostare o resettare i cookie, come accedervi e come eliminarli.

L'anatomia di un biscotto

I cookie vengono solitamente impostati in un'intestazione HTTP (sebbene JavaScript possa anche impostare un cookie direttamente su un browser). Un servlet che imposta un cookie potrebbe inviare intestazioni che assomigliano a questo:

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

Come puoi vedere, l'intestazione Set-Cookie contiene una coppia di valori nome, una data GMT, un percorso e un dominio. Il nome e il valore saranno codificati in URL. Il campo expires è un'istruzione al browser per "dimenticare" il cookie dopo l'ora e la data specificate.

Se il browser è configurato per memorizzare i cookie, manterrà queste informazioni fino alla data di scadenza. Se l'utente punta il browser su una qualsiasi pagina che corrisponde al percorso e al dominio del cookie, rinvierà il cookie al server. Le intestazioni del browser potrebbero assomigliare a questo:

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 avrà quindi accesso al cookie tramite il metodo di richiesta request.getCookies () che restituisce un array di oggetti Cookie .

Metodi dei cookie servlet

Di seguito è riportato l'elenco dei metodi utili che è possibile utilizzare durante la manipolazione dei cookie in servlet.

Sr.No. Metodo e descrizione
1

public void setDomain(String pattern)

Questo metodo imposta il dominio a cui si applica il cookie, ad esempio tutorialspoint.com.

2

public String getDomain()

Questo metodo ottiene il dominio a cui si applica il cookie, ad esempio tutorialspoint.com.

3

public void setMaxAge(int expiry)

Questo metodo imposta quanto tempo (in secondi) deve trascorrere prima che il cookie scada. Se non lo imposti, il cookie durerà solo per la sessione corrente.

4

public int getMaxAge()

Questo metodo restituisce la durata massima del cookie, specificata in secondi. Per impostazione predefinita, -1 indica che il cookie persisterà fino alla chiusura del browser.

5

public String getName()

Questo metodo restituisce il nome del cookie. Il nome non può essere modificato dopo la creazione.

6

public void setValue(String newValue)

Questo metodo imposta il valore associato al cookie

7

public String getValue()

Questo metodo ottiene il valore associato al cookie.

8

public void setPath(String uri)

Questo metodo imposta il percorso a cui si applica questo cookie. Se non specifichi un percorso, il cookie viene restituito per tutti gli URL nella stessa directory della pagina corrente e per tutte le sottodirectory.

9

public String getPath()

Questo metodo ottiene il percorso a cui si applica questo cookie.

10

public void setSecure(boolean flag)

Questo metodo imposta il valore booleano che indica se il cookie deve essere inviato solo tramite connessioni crittografate (ovvero SSL).

11

public void setComment(String purpose)

Questo metodo specifica un commento che descrive lo scopo di un cookie. Il commento è utile se il browser presenta il cookie all'utente.

12

public String getComment()

Questo metodo restituisce il commento che descrive lo scopo di questo cookie o null se il cookie non ha commenti.

Impostazione dei cookie con Servlet

L'impostazione dei cookie con servlet prevede tre passaggi:

(1) Creating a Cookie object - Chiami il costruttore di cookie con un nome di cookie e un valore di cookie, entrambi stringhe.

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

Tieni presente che né il nome né il valore devono contenere spazi bianchi o uno dei seguenti caratteri:

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

(2) Setting the maximum age- Utilizza setMaxAge per specificare per quanto tempo (in secondi) il cookie deve essere valido. Di seguito viene impostato un cookie per 24 ore.

cookie.setMaxAge(60 * 60 * 24);

(3) Sending the Cookie into the HTTP response headers - Utilizza response.addCookie per aggiungere cookie nell'intestazione della risposta HTTP come segue:

response.addCookie(cookie);

Esempio

Modifichiamo il nostro Form Example per impostare i cookie per nome e cognome.

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

Compila il servlet sopra HelloForm e creare la voce appropriata nel file web.xml e infine provare a seguire la pagina HTML per chiamare 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>

Mantieni il contenuto HTML sopra in un file Hello.htm e mettilo nella directory <Tomcat-installationdirectory> / webapps / ROOT. Quando accederai a http: // localhost: 8080 / Hello.htm , ecco l'output effettivo del modulo precedente.

Prova a inserire Nome e Cognome, quindi fai clic sul pulsante Invia. Questo mostrerebbe il nome e il cognome sullo schermo e allo stesso tempo imposterebbe due cookie firstName e lastName che sarebbero passati di nuovo al server la prossima volta che premerai il pulsante Invia.

La sezione successiva spiegherebbe come accedere a questi cookie nella tua applicazione web.

Lettura di biscotti con servlet

Per leggere i cookie, è necessario creare un array di oggetti javax.servlet.http.Cookie chiamando ilgetCookies()metodo di HttpServletRequest . Quindi scorrere l'array e utilizzare i metodi getName () e getValue () per accedere a ciascun cookie e al valore associato.

Esempio

Leggiamo i cookie che abbiamo impostato nell'esempio precedente -

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

Compila il servlet sopra ReadCookiese creare la voce appropriata nel file web.xml. Se avessi impostato il cookie first_name come "John" e il cookie last_name come "Player", l'esecuzione di http: // localhost: 8080 / ReadCookies visualizzerebbe il seguente risultato:

Found Cookies Name and Value

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

Elimina i cookie con Servlet

Eliminare i cookie è molto semplice. Se desideri eliminare un cookie, devi semplicemente seguire i tre passaggi seguenti:

  • Leggere un cookie già esistente e salvarlo nell'oggetto Cookie.

  • Imposta l'età dei cookie su zero utilizzando setMaxAge() metodo per eliminare un cookie esistente

  • Aggiungi di nuovo questo cookie nell'intestazione della risposta.

Esempio

Il seguente esempio eliminerebbe un cookie esistente denominato "first_name" e quando si eseguirà il servlet ReadCookies la prossima volta, restituirà un valore nullo per 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>");
   }
}

Compila il servlet sopra DeleteCookiese creare la voce appropriata nel file web.xml. Ora l'esecuzione di http: // localhost: 8080 / DeleteCookies visualizzerà il seguente risultato:

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Ora prova a eseguire http: // localhost: 8080 / ReadCookies e visualizzerà solo un cookie come segue:

Found Cookies Name and Value

Name : last_name, Value: Player

È possibile eliminare manualmente i cookie in Internet Explorer. Inizia dal menu Strumenti e seleziona Opzioni Internet. Per eliminare tutti i cookie, premere Elimina cookie.