Manejo de datos de la sesión en Servlets

(Octubre de 2005, última modificación Enero 2006)

Introducción

Todas las peticiones (invocaciones) al servlet implican diferentes hilos, pero la misma instancia de la clase, por tanto, las peticiones comparten las variables atributo. El lector se puede plantear que hay situaciones en las que nos interesa que la sesión mantenga datos propios, no compartidos con otras sesiones. Por ejemplo, cuando estamos en una web transaccional (una tienda electrónica) queremos que cada sesión pueda utilizar datos específicos, como la identificación de usuario o el carrito de la compra.

En nuestro siguiente ejemplo un servlet genera un formulario que llama a otro servlet. Lo importante del ejemplo es que el primer servlet almacena datos como atributos de la sesión y el segundo servlet los recupera.

El formulario que invoca al primer servlet es el siguiente:

Login:

El código fuente del primer servlet está disponible aquí. Lo esencial es que obtenemos la sesión:


    HttpSession sesion = request.getSession( true );
	

El argumento true indica que si no hay sesión, entonces se crea. La versión sin argumento realiza la misma acción (si no hay sesión, se crea). Si utilizamos el argumento false, request.getSession( false ), entonces si no existe la sesión no crea una nueva y devuelve null. El paso siguiente es poner en la sesión el nombre que recibimos del formulario (request.getParameter("login")). Introducimos este dato en el atributo "login" de la sesión:


    sesion.setAttribute("login", request.getParameter("login"));
	

Este servlet escribe un formulario en el que se pregunta por el apellido y llama al segundo servlet (código fuente). Este segundo servlet recibe:

  1. El login del atributo de la sesión


  2. El apellido lo recibe como un parámetro del formulario. Este apellido también lo acaba almacenando como atributo de sesión, con lo cual, terminamos teniendo dos atributos en la sesión:
    
          sesion.setAttribute("apellido", request.getParameter("apellido"));
    	
    Con el siguiente código el segundo servlet recupera los atributos de la sesión:
    
        for (Enumeration e = sesion.getAttributeNames(); e.hasMoreElements(); ) {
            String atrib = (String) e.nextElement();
            out.print("<P>" + atrib + ": " + sesion.getAttribute(atrib) + "</P>" );
        }
    	

Borrar e invalidar

Podemos borrar atributos de la sesión:


    sesion.removeAttribute( "login");
    sesion.removeAttribute( "apellido");
	

Hay algunas webs comerciales en las que se da al usuario la opción de inhabilitar o invalidar la sesión una vez que ha realizado las transacciones. De cara al usuario aparece el botón "desconectar". Con el método sesion.invalidate() se borran datos y se invalida la sesión.

Otra característica de la sesión es que podemos especificar su tiempo de expiración: public void setMaxInactiveInterval(int interval). Especifica el máximo de tiempo, en segundos, que el cliente puede estar inactivo (sin hacer peticiones), antes de que el contenedor de servlets invalide la sesión. Un número negativo indica que la sesión no expira.



Volver al índice