Servlets - Manejo de cookies

Las cookies son archivos de texto almacenados en la computadora del cliente y se guardan para varios propósitos de rastreo de información. Java Servlets admite de forma transparente las cookies HTTP.

Hay tres pasos involucrados en la identificación de usuarios recurrentes:

  • La secuencia de comandos del servidor envía un conjunto de cookies al navegador. Por ejemplo, nombre, edad o número de identificación, etc.

  • El navegador almacena esta información en la máquina local para uso futuro.

  • La próxima vez que el navegador envíe una solicitud al servidor web, enviará la información de las cookies al servidor y el servidor utilizará esa información para identificar al usuario.

Este capítulo le enseñará cómo configurar o restablecer las cookies, cómo acceder a ellas y cómo eliminarlas.

La anatomía de una galleta

Las cookies generalmente se establecen en un encabezado HTTP (aunque JavaScript también puede configurar una cookie directamente en un navegador). Un servlet que establece una cookie puede enviar encabezados que se parecen a esto:

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

Como puede ver, el encabezado Set-Cookie contiene un par de nombre-valor, una fecha GMT, una ruta y un dominio. El nombre y el valor estarán codificados en URL. El campo expira es una instrucción para el navegador de "olvidar" la cookie después de la fecha y hora indicadas.

Si el navegador está configurado para almacenar cookies, conservará esta información hasta la fecha de caducidad. Si el usuario apunta el navegador a cualquier página que coincida con la ruta y el dominio de la cookie, reenviará la cookie al servidor. Los encabezados del navegador pueden verse así:

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 tendrá acceso a la cookie a través del método de solicitud request.getCookies () que devuelve una matriz de objetos Cookie .

Métodos de cookies de servlet

A continuación se muestra la lista de métodos útiles que puede utilizar al manipular las cookies en el servlet.

No Señor. Método y descripción
1

public void setDomain(String pattern)

Este método establece el dominio al que se aplica la cookie, por ejemplo, tutorialspoint.com.

2

public String getDomain()

Este método obtiene el dominio al que se aplica la cookie, por ejemplo, tutorialspoint.com.

3

public void setMaxAge(int expiry)

Este método establece cuánto tiempo (en segundos) debe transcurrir antes de que caduque la cookie. Si no configura esto, la cookie solo durará durante la sesión actual.

4

public int getMaxAge()

Este método devuelve la edad máxima de la cookie, especificada en segundos. De forma predeterminada, -1 indica que la cookie persistirá hasta que se apague el navegador.

5

public String getName()

Este método devuelve el nombre de la cookie. El nombre no se puede cambiar después de la creación.

6

public void setValue(String newValue)

Este método establece el valor asociado con la cookie.

7

public String getValue()

Este método obtiene el valor asociado con la cookie.

8

public void setPath(String uri)

Este método establece la ruta a la que se aplica esta cookie. Si no especifica una ruta, la cookie se devuelve para todas las URL en el mismo directorio que la página actual, así como para todos los subdirectorios.

9

public String getPath()

Este método obtiene la ruta a la que se aplica esta cookie.

10

public void setSecure(boolean flag)

Este método establece el valor booleano que indica si la cookie solo debe enviarse a través de conexiones cifradas (es decir, SSL).

11

public void setComment(String purpose)

Este método especifica un comentario que describe el propósito de una cookie. El comentario es útil si el navegador presenta la cookie al usuario.

12

public String getComment()

Este método devuelve el comentario que describe el propósito de esta cookie, o nulo si la cookie no tiene comentarios.

Configuración de cookies con servlet

La configuración de cookies con servlet implica tres pasos:

(1) Creating a Cookie object - Llamas al constructor de cookies con un nombre de cookie y un valor de cookie, ambos son cadenas.

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

Tenga en cuenta que ni el nombre ni el valor deben contener espacios en blanco ni ninguno de los siguientes caracteres:

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

(2) Setting the maximum age- Utiliza setMaxAge para especificar cuánto tiempo (en segundos) debe ser válida la cookie. Lo siguiente configuraría una cookie durante 24 horas.

cookie.setMaxAge(60 * 60 * 24);

(3) Sending the Cookie into the HTTP response headers - Utiliza response.addCookie para agregar cookies en el encabezado de respuesta HTTP de la siguiente manera -

response.addCookie(cookie);

Ejemplo

Modifiquemos nuestro Ejemplo de formulario para configurar las cookies para el nombre y apellido.

// 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 el servlet anterior HelloForm y cree la entrada adecuada en el archivo web.xml y finalmente intente seguir la página HTML para llamar al 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>

Mantenga el contenido HTML anterior en un archivo Hello.htm y colóquelo en el directorio <Tomcat-installationdirectory> / webapps / ROOT. Cuando acceda a http: // localhost: 8080 / Hello.htm , aquí está el resultado real del formulario anterior.

Intente ingresar el nombre y apellido y luego haga clic en el botón enviar. Esto mostraría el nombre y apellido en su pantalla y al mismo tiempo establecería dos cookies firstName y lastName que serían devueltas al servidor la próxima vez que presione el botón Enviar.

La siguiente sección le explicaría cómo accedería a estas cookies en su aplicación web.

Leer cookies con Servlet

Para leer las cookies, debe crear una matriz de objetos javax.servlet.http.Cookie llamando algetCookies()método de HttpServletRequest . Luego, recorra la matriz y use los métodos getName () y getValue () para acceder a cada cookie y valor asociado.

Ejemplo

Leamos las cookies que hemos establecido en el ejemplo anterior:

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

Compilar el servlet anterior ReadCookiesy cree la entrada adecuada en el archivo web.xml. Si hubiera configurado la cookie first_name como "John" y la cookie last_name como "Player", al ejecutar http: // localhost: 8080 / ReadCookies se mostraría el siguiente resultado:

Found Cookies Name and Value

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

Eliminar cookies con Servlet

Eliminar las cookies es muy sencillo. Si desea eliminar una cookie, simplemente debe seguir tres pasos:

  • Leer una cookie ya existente y almacenarla en el objeto Cookie.

  • Establecer la edad de la cookie como cero usando setMaxAge() método para eliminar una cookie existente

  • Vuelva a agregar esta cookie al encabezado de respuesta.

Ejemplo

El siguiente ejemplo eliminaría una cookie existente llamada "first_name" y cuando ejecute el servlet ReadCookies la próxima vez devolverá un valor nulo para 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>");
   }
}

Compilar el servlet anterior DeleteCookiesy cree la entrada adecuada en el archivo web.xml. Ahora ejecutando http: // localhost: 8080 / DeleteCookies mostraría el siguiente resultado:

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Ahora intente ejecutar http: // localhost: 8080 / ReadCookies y solo mostraría una cookie de la siguiente manera:

Found Cookies Name and Value

Name : last_name, Value: Player

Puede eliminar sus cookies en Internet Explorer manualmente. Comience en el menú Herramientas y seleccione Opciones de Internet. Para eliminar todas las cookies, presione Eliminar cookies.