Las sesiones vistas anteriormente basan su funcionamiento en los cookies. Cuando
se hace uso de la interfaz HttpSession de forma interna y totalmente transparente al
programador se está haciendo uso de los cookies. De hecho cuando a través de una página
JSP se comienza una sesión, se crea un cookie llamado JSSESIONID.La diferencia es que
este cookie es temporal y durará el tiempo que permanezca el navegador ejecutándose,
siendo borrada cuando el usuario cierre el navegador.
Creación de cookies
Un cookie almacenado en el ordenador de un usuario está compuesto por un nombre
y un valor asociado al mismo. Además, asociada a este cookie pueden existir una serie de
atributos que definen datos como su tiempo de vida, alcance, dominio, etc.
Cabe reseñar que los cookies, no son más que ficheros de texto, que no pueden
superar un tamaño de 4Kb, además los navegadores tan sólo pueden aceptar 20 cookies de
un mismo servidor web (300 cookies en total).
Para crear un objeto de tipo Cookie se utiliza el constructor de la clase Cookie que
requiere su nombre y el valor a guardar. El siguiente ejemplo crearía un objeto Cookie que
contiene el nombre “nombre” y el valor “objetos”.
<%
Cookie miCookie=new Cookie(“nombre”,”objetos”);
%>
También es posible crear cookies con contenido que se genere de forma dinámica.
El siguiente código muestra un cookie que guarda un texto que está concatenado a la
fecha/hora en ese momento:
<%@page contentType="text/html; charset=iso-8859-1" session="true"
language="java" import="java.util.*" %>
<%
Cookie miCookie=null;
Date fecha=new Date();
String texto= “Este es el texto que vamos a guardar en el
cookie”+fecha;
miCookie=new Cookie(“nombre”,texto);
%>
En esta ocasión el contenido del valor a guardar en el cookie está en la variable
“texto”.
También se pueden guardar valores o datos que provengan de páginas anteriores y
que hayan sido introducidas a través de un formulario:
<%
Cookie miCookie=null;
String ciudad= request.getParameter(“formCiudad”);
miCookie=new Cookie(“ciudadFavorita”,ciudad);
%>
Una vez que se ha creado un cookie, es necesario establecer una serie de atributos
para poder ser utilizado. El primero de esos atributos es el que se conoce como tiempo de
vida.
Por defecto, cuando creamos un cookie, se mantiene mientras dura la ejecución del
navegador. Si el usuario cierra el navegador, los cookies que no tengan establecido un
tiempo de vida serán destruidos.
Por tanto, si se quiere que un cookie dure más tiempo y esté disponible para otras
situaciones es necesario establecer un valor de tiempo (en segundos) que será la duración o
tiempo de vida del cookie. Para establecer este atributo se utiliza el método setMaxAge().
El siguiente ejemplo establece un tiempo de 31 días de vida para el cookie “unCookie”:
<%
unCookie.setMaxAge(60*60*24*31);
%>
Si se utiliza un valor positivo, el cookie será destruido después de haber pasado ese
tiempo, si el valor es negativo el cookie no será almacenado y se borrará cuando el usuario
cierre el navegador. Por último si el valor que se establece como tiempo es cero, el cookie
será borrado.
Otros de los atributos que se incluye cuando se crea un cookie es el path desde el
que será visto, es decir, si el valor del path es “/” (raíz), quiere decir que en todo el site se
podrá utilizar ese cookie, pero si el valor es “/datos” quiere decir que el valor del cookie
sólo será visible dentro del directorio “datos”. Este atributo se establece mediante el método
setPath().
<%
unCookie.setPath(“/”);
%>
Para conocer el valor de path, se puede utilizar el método getPath().
<%
out.println(“cookie visible en: “+unCookie.getPath());
%>
Existe un método dentro de la clase Cookie que permite establecer el dominio desde
el cual se ha generado el cookie. Este método tiene su significado porque un navegador sólo
envía al servidor los cookies que coinciden con el dominio del servidor que los envió. Si en
alguna ocasión se requiere que estén disponibles desde otros subdominios se especifica con
el método setDomain(). Por ejemplo, si existe el servidor web en la página
www.paginasjsp.com , pero al mismo tiempo también existen otros subdominios como
usuario1.paginasjsp.com, usuario2.paginasjsp.com, etc.
Si no se establece la propiedad domain se entiende que el cookie será visto sólo
desde el dominio que lo creó, pero sin embardo si se especifica un nombre de dominio se
entenderá que el cookie será visto en aquellos dominios que contengan el nombre
especificado.
En el siguiente ejemplo hace que el cookie definido en el objeto “unCookie” esté
disponible para todos los dominios que contengan el nombre “.paginasjsp.com”. Un
nombre de dominio debe comenzar por un punto.
<%
unCookie.setDomain(“.paginasjsp.com”);
%>
Igualmente, para conocer el dominio sobre el que actúa el cookie, basta con utilizar
el método getDomain() para obtener esa información.
Una vez que se ha creado el objeto Cookie, y se ha establecido todos los atributos
necesarios es el momento de crear realmente, ya que hasta ahora sólo se tenía un objeto que
representa ese cookie.
Para crear el fichero cookie real, se utiliza el método addCookie() de la interfaz
HttpServletResponse:
<%
response.addCookie(unCookie);
%>
Una vez ejecutada esta línea es cuando el cookie existe en el disco del cliente que
ha accedido a la página JSP.
Es importante señalar que si no se ejecuta esta última línea el cookie no habrá sido
grabado en el disco, y por lo tanto, cualquier aplicación o página que espere encontrar
dicho cookie no lo encontrará.
Recuperar cookies
El proceso de recuperar un cookie determinado puede parecer algo complejo, ya que
no hay una forma de poder acceder a un cookie de forma directa. Por este motivo es
necesario recoger todos los cookies que existen hasta ese momento e ir buscando aquél que
se quiera, y que al menos, se conoce su nombre.
Para recoger todos los cookies que tenga el usuario guardados se crea un array de
tipo Cookie, y se utiliza el método getCookies() de la interfaz HttpServletRequest para
recuperarlos:
<%
Cookie [] todosLosCookies=request.getCookies();
/*El siguiente paso es crear un bucle que vaya leyendo todos los
cookies.*/
for(int i=0;i
Cookie unCookie=todosLosCookies[i];
/*A continuación se compara los nombres de cada uno de los
cookies con el que se está buscando. Si se encuentra un cookie con
ese nombre se ha dado con el que se está buscando, de forma que se
sale del bucle mediante break. */
if(unCookie.getName().equals(“nombre”))
break;
}
/*Una vez localizado tan sólo queda utilizar los métodos apropiados
para obtener la información necesaria que contiene.*/
out.println(“Nombre: “+unCookie.getName()+”);
out.println(“Valor: “+unCookie.getValue()+”);
out.println(“Path: “+unCookie.getPath()+”);
out.println(“Tiempo de vida:“+unCookie.getMaxAge()+”);
out.println(“Dominio: “+unCookie.getDomain()+”);
%>
Caducidad
Todas las cookies tienen un período de caducidad. Cuando este tiempo se cumple, la cookie desaparece. Teniendo en cuenta este comportamiento cabe distinguir cuatro tipos de cookies:
Cookies de sesión: desaparecen cuando se acaba la sesión, entendiendo por sesión el período de tiempo que un usuario está en un sitio web de manera continuada con la misma ventana del navegador.
Cookies permanentes: si la fecha de caducidad de la cookie se corresponde con un futuro lejano, se puede decir que la cookie que es permanente. Esto no es del todo cierto, como se ha observado, ya que los navegadores cuentan con un espacio limitado para almacenar cookies de manera que las más nuevas hacen desaparecer a las más viejas cuando dicho espacio está totalmente ocupado.
Cookies con fecha de caducidad: a veces los sitios web establecen cookies con una fecha de caducidad concreta. Por ejemplo, se puede utilizar una cookie para recordar a un cliente que existe una oferta. Esta cookie tendrá necesariamente la fecha de caducidad de la propia oferta, más allá de la cual no tienen ningún sentido que siga existiendo.
Cookies para borrar: borrar una cookie existente es como volver a escribirla con una fecha de caducidad anterior a la fecha actual.
Dominios y Subdominios
Toda cookie está vinculada con un dominio o subdominio. Además existe una restricción impuesta por el propio estándar de manera que no es posible acceder a cookies de otro dominio o subdominio que no sea el de la propia URL donde se encuentra la página web. Esto significa que una página web en la dirección www.idg.es, por ejemplo, sólo podrá acceder a las cookies vinculadas con los dominios www.idg.es y .idg.es.
Como ya se verá más adelante, las distintas tecnologías, ya sean de cliente o de servidor, disponen de los mecanismos necesarios para implementar dicho vínculo.
Una cookie que es del dominio .idg.es será accesible desde cualquier URL que sea del tipo ordenadores .idg.es, internet.idg.es, o incluso, www.ordenadores.idg.es o www.internet.idg.es. La restricción se extiende desde el caso general hasta los casos particulares.
Ahora bien, una cookie del dominio www.internet.idg.es no será accesible desde una página web que se encuentre bajo la dirección URL www.ordenadores.idg.es. Si se desea que ambos sitios compartan cookies no queda más remedio que éstas sean del dominio .idg.es, que es compartido por ambos.
Cookies con Java
Java es una de las tecnologías que más se utilizan en actualidad a la hora de desarrollar aplicaciones Web. Cada vez es mayor el número de portales y sitios web que se han construido utilizando páginas JSP o servlets. Evidentemente el API que se encuentra por detrás ofrece los recursos necesarios para poder leer y/o escribir cookies.
En el paquete estándar javax.servlet.http se encuentra la clase Cookie recogida de la siguiente forma:
public class Cookie implements Cloneable
El constructor de la clase se define como:
public Cookie(String name, String value);
El primer parámetro se corresponde con el nombre de la cookie y el segundo con el valor de la misma. El resto de los métodos de la clase cookie se divide en dos grupos: los método getXXX sirven para obtener información de la cookie; los métodos setXXX sirven para establecer las características de la cookie. A continuación de muestra un resumen de ambos grupos:
Métodos getXXX
public String getComment();
public String getDomain();
public int getMaxAge();
public String getName();
public String getPath();
public boolean getSecure();
public String getValue();
public void setComment(String purpose);
SUBIR