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:
Para obtener informaci�n de un cookie:
- Recupera todos los cookies de la petici�n del usuario.
- Busca el cookie o cookies con el nombre que te interesa, utiliza las t�cnicas de programaci�n est�ndard.
- 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>" + ...);