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.

creacion 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()+”); %>