Servlets (Básico)

Las Cookies son una forma para que un servidor (o un servlet, como parte de un servidor) env�e informaci�n al cliente para almacenarla, y para que el servidor pueda posteriormente recuperar esos datos desde el cliente. Los servlet env�an cookies al cliente a�adiendo campos a las cabeceras de respuesta HTTP. Los clientes devuelven las cookies autom�ticamente a�adiendo campos a las cabeceras de peticiones HTTP.

Cada cabecera de petici�n o respuesta HTTP es nombrada como un s�lo valor. Por ejemplo, una cookie podr�a tener un nombre de cabecera BookToBuy con un valor 304qty1, indicando a la aplicaci�n llamante que el usuario quiere comprar una copia del libro con el n�mero 304 en el inventario. (Las cookies y sus valores son espec�ficos de la aplicaci�n).

Varias cookies pueden tener el mismo nombre. Por ejemplo, un servlet podr�a enviar dos cabeceras llamadas BookToBuy; una podr�a tener el valor anterior, 304qty1, mientras que la otra podr�a tener el valor 301qty3. Estas cookies podr�an indicar que el usuario quiere comprar una copia del libro con el n�mero 304 en el inventario y tres copias del libro con el n�mero 301del inventario.

Adem�s de un nombre y un valor, tambi�n se pueden proporcionar atributos opcionales como comentarios. Los navegadores actuales no siempre tratan correctamente a los atributos opcionales, por eso ten cuidado con ellos.

Un servidor puede proporcionar una o m�s cookies a un cliente. El software del cliente, como un navegador, se espera que pueda soportar veinte cookies por host de al menos 4 kb cada una.

Cuando se env�a una cookie al cliente, el est�ndard HTTP/1.0 captura la p�gina que no est� en la cach�. Actualmente, el javax.servlet.http.Cookie no soporta los controles de cach� del HTTP/1.1.

Las cookies que un cliente almacena para un servidor s�lo pueden ser devueltas a ese mismo servidor. Un servidor puede contener m�ltiples servlets; el ejemplo Duke's Bookstore est� compuesto por varios servlets ejecut�ndose en un s�lo servidor. Como las cookies son devueltas al servidor, los servlets que se ejecutan dentro de un servidor comparten las cookies. Los ejemplos de esta p�gina ilustran esto mostrando como los servletsCatalogServlet y ShowCart trabajan con los mismos cookies.

Nota:

Esta p�gina tiene c�digo que no forma parte del ejemplo Duke's Bookstore. Duke's Bookstore utilizar�a c�digo como el de esta p�gina si utilizar� cookies en vez de seguimiento de sesi�n para los pedidos de los clientes. C�mo las cookies no forman parte de Duke's Bookstore, piensa en los ejemplos de esta p�gina como pseudo-c�digo.

Para enviar una cookie:

  1. Ejemplariza un objeto Cookie.
  2. Selecciona cualquier atributo.
  3. Envia el cookie

Para obtener informaci�n de un cookie:

  1. Recupera todos los cookies de la petici�n del usuario.
  2. Busca el cookie o cookies con el nombre que te interesa, utiliza las t�cnicas de programaci�n est�ndard.
  3. Obt�n los balores de las cookies que hayas encontrado.

.�Crear un Cookie

El constructor de la clase javax.servlet.http.Cookie crea un cookie con un nombre inicial y un valor. Se puede cambiar el valor posteriormente utilizando el m�todo setValue.

El nombre del cookie debe ser un token HTTP/1.1. Los tokens son strings que contienen uno de los caracteres especiales liestados en RFC 2068. (Strings alfanum�ricos cualificados como tokens.) Adem�s, los nombres que empiezan con el car�cter dollar ("$") est�n reservados por RFC 2109.

El valor del cookie puede ser cualquier string, aunque no est� garantizado que los valores null funcionen en todos los navegadores. Adem�s, si enviamos una cookie que cumpla con las especificaciones originales de las cookies de Netscape, no se deben utilizar car�cteres blancos ni ninguno de estos caracteres.

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

Si nuestro servlet devuelve una respuesta al usuario con un Writer, debemos crear la cookie antes de acceder a Writer. (Porque las cookies se env�an al cliente como una cabecera, y las cabeceras deben escribirse antes de acceder al Writer.)

Si el CatalogServlet utilizar� cookies para seguir la pista de una hoja de pedido, el servlet podr�a crear las cookies de esta forma.

    public void doGet (HttpServletRequest request,
                       HttpServletResponse response)
	throws ServletException, IOException
    {
        BookDBServlet database = (BookDBServlet)
            getServletConfig().getServletContext().getServlet("bookdb");

        // Check for pending adds to the shopping cart
        String bookId = request.getParameter("Buy");

        //If the user wants to add a book, remember it by adding a cookie
        if (bookId != null) {
            Cookie getBook = new Cookie("Buy", bookId);
            ...
        }

	// set content-type header before accessing the Writer
        response.setContentType("text/html");

        // now get the writer and write the data of the response
	PrintWriter out = response.getWriter();
        out.println("<html>" +
                    "<head><title> Book Catalog </title></head>" + ...);
        ...
    }

.�Seleccionar los Atributos de un Cookie

La clase Cookie proporciona varios m�todos para seleccionar los valores del cookie y sus atributos. La utilizaci�n de estos m�todos es correcta, est�n explicados en el javadoc para la clase Cookie.

El siguiente ejemplo selecciona el campo comment del cookie CatalogServlet. Este campo describe el prop�sito del cookie.

    public void doGet (HttpServletRequest request,
                       HttpServletResponse response)
	throws ServletException, IOException
    {
        ...
        //If the user wants to add a book, remember it by adding a cookie
        if (values != null) {
            bookId = values[0];
            Cookie getBook = new Cookie("Buy", bookId);
            getBook.setComment("User wants to buy this book " +
                               "from the bookstore.");
        }
        ...
    }

Tambi�n se puede seleccionar la caducidad del cookie. Este atributo es �til, por ejemplo, para borrar un cookie. De nuevo, si Duke's Bookstore utilizar� cookies para su hoja de pedidos, el ejemplo podr�a utilizar este atributo para borrar un libro de la hoja de pedido. El usuario borra un libro de la hoja de pedidos en el ShowCartServlet; su c�digo se podr�a parecer a esto.

    public void doGet (HttpServletRequest request,
                       HttpServletResponse response)
	throws ServletException, IOException
    {
	...
        /* Handle any pending deletes from the shopping cart */
        String bookId = request.getParameter("Remove");
        ...        
        if (bookId != null) {
            // Find the cookie that pertains to the book to remove
            ...
                    // Delete the cookie by setting its maximum age to zero
                    thisCookie.setMaxAge(0);
            ...
        }
            
	// also set content type header before accessing the Writer
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        //Print out the response
        out.println("<html> <head>" +
                    "<title>Your Shopping Cart</title>" + ...);

.�Enviar Cookies

Las cookies se env�an como cabeceras en la respuesta al cliente, se a�aden con el m�todo addCookie de la clase HttpServletResponse. Si estamos utilizando un Writer para devolver texto, debemos llamar a addCookie antes de llamar al m�todo getWriter de HttpServletResponse.

Continuando con el ejemplo de CatalogServlet, aqu� est� el c�digo para enviar la cookie.

    public void doGet (HttpServletRequest request,
                       HttpServletResponse response)
	throws ServletException, IOException
    {
        ...
        //If the user wants to add a book, remember it by adding a cookie
        if (values != null) {
            bookId = values[0];
            Cookie getBook = new Cookie("Buy", bookId);
            getBook.setComment("User has indicated a desire " +
                               "to buy this book from the bookstore.");
            response.addCookie(getBook);
        }
        ...
    }

.�Recuperar Cookies

Los clientes devuelven las cookies como campos a�adidos a las cabeceras de petici�n HTTP. Para recuperar una cookie, debemos recuperar todas las cookies utilizando el m�todo getCookies de la clase HttpServletRequest.

El m�todo getCookies devuelve un array de objetos Cookie, en el que podemos buscar la cookie o cookies que querramos. (Recuerda que distintas cookies pueden tener el mismo nombre, para obtener el nombre de una cookie, utiliza su m�todo getName.)

Para continuar con el ejemplo ShowCartServlet.

    public void doGet (HttpServletRequest request,
                       HttpServletResponse response)
	throws ServletException, IOException
    {
	...
        /* Handle any pending deletes from the shopping cart */
        String bookId = request.getParameter("Remove");
        ...        
        if (bookId != null) {
            
            // Find the cookie that pertains to the book to remove
            Cookie[] cookies = request.getCookies();
            ...
            // Delete the book's cookie by setting its maximum age to zero
            thisCookie.setMaxAge(0);
        }
            
	// also set content type header before accessing the Writer
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        //Print out the response
        out.println("<html> <head>" +
                    "<title>Your Shopping Cart</title>" + ...);

.�Obtener el valor de una Cookie

Para obtener el valor de una cookie, se utiliza el m�todo getValue.

    public void doGet (HttpServletRequest request,
                       HttpServletResponse response)
	throws ServletException, IOException
    {
        ...
        /* Handle any pending deletes from the shopping cart */
        String bookId = request.getParameter("Remove");
        ...        
        if (bookId != null) {
            // Find the cookie that pertains to that book
            Cookie[] cookies = request.getCookies();
            for(i=0; i < cookies.length; i++) {
                Cookie thisCookie = cookie[i];
                if (thisCookie.getName().equals("Buy") &&
                    thisCookie.getValue().equals(bookId)) {

                    // Delete the cookie by setting its maximum age to zero
                    thisCookie.setMaxAge(0);
                }
            }
        }
            
	// also set content type header before accessing the Writer
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        //Print out the response
        out.println("<html> <head>" +
                    "<title>Your Shopping Cart</title>" + ...);

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP