Cookies y sesiones

 

1. (SUBASTA) Como ejercicio de seguimiento de este tema, vamos a añadir el seguimiento de sesiones a nuestra aplicación de subastas. Para eso, sobre lo que tenemos hecho, aplicaremos los siguientes cambios:

a) En todas las páginas:

Aplicar la reescritura de URLs. Tenemos que buscar las URLs que aparezcan en cada servlet (que tendrán la forma "/subasta/...", normalmente), y aplicarles reescritura de la siguiente forma:

Por:

out.println ("<form action=\"" + 
       response.encodeURL("/subasta/main?accion=...") + 
       "\">");

Y se sustituye cada enlace:

out.println ("<a href=\"/subasta/main?accion=...\">Volver</a>");

Por:

out.println ("<a href=\"" + 
    response.encodeURL("/subasta/main?accion=validar") + 
    "\">Volver</a>");
response.sendRedirect("/subasta/login?...");

Por:

response.sendRedirect(
    response.encodeRedirectURL("/subasta/login?..."));

b) En ServletMain

Dentro de ServletMain hay que hacer algunos cambios para el seguimiento de sesiones:

HttpSession sesion = request.getSession();
String login = request.getParameter("login);
String password = request.getParameter("password");
private String getAtributo(HttpSession sesion, 
                           String atributo)
{
   if (sesion == null)
	return null;
   return (String)(sesion.getAttribute(atributo));
}

private boolean hayDatos(HttpSession sesion)
{
   return (getAtributo(sesion, "login") != null && 
           getAtributo(sesion, "password") != null);
}

Con getAtributo(...) podremos obtener en cada momento el login y password de la sesión, sin más que llamar al método con:

String login = getAtributo(sesion, "login");
String password = getAtributo(sesion, "password");

Con hayDatos(...) obtendremos true si el usuario ha introducido login y password (estarán almacenados en la sesión), y false si no.

accion == registrar: tomamos login y password, además del mail (porque ya no los tomamos al principio del método):

String login = request.getParameter("login);
String password = request.getParameter("password");
String email = request.getParameter("email");

if (email != null && login != null && password != null)
{
	...

accion == validar: tomamos login y password (porque ya no los tomamos al principio del método). Luego, si hay login y password validamos el usuario y actualizamos los datos de la sesión (login y password), y si no hay login y password, y no hay datos, volvemos a  ServletLogin:

String login = request.getParameter("login);
String password = request.getParameter("password");

if (login != null && password != null)
{
	if (!validaUsuario(login, password))
	    // ... a ServletLogin
	else
	{
	    sesion.setAttribute("login", login);
	    sesion.setAttribute("password", password);
	}
} else if (!hayDatos(sesion)) {
	// ... a ServletLogin
}

accion == comprar/vender/adjudicar/cancelar: primero comprobamos si hay datos de sesión, y si no los hay redirigimos a ServletLogin. Si hay datos de sesión, el resto es igual. Sólo hay que tener en cuenta que el login y password, si son necesarios, no se toman ya de los parámetros de entrada, sino de los datos de sesión:

String login = request.getParameter("login");
String password = request.getParameter("password");

pasan a ser:

String login = getAtributo(sesion, "login");
String password = getAtributo(sesion, "password");

c) Eliminar parámetros innecesarios

Finalmente nos ocupamos de algo que con el seguimiento de sesiones no es necesario. Hasta ahora, sin seguimiento de sesiones, para poder mantener el login y password del usuario a lo largo de la "sesión", teníamos que irlos pasando entre servlets, como datos del formulario (como campos ocultos del formulario, o en los parámetros de la petición GET, etc).

Ahora, con el seguimiento de sesiones, esos parámetros no son necesarios. Si los hemos empleado podemos quitarlos de donde estén. Normalmente los utilizaremos en el ServletMain para llamarse a sí mismo, o para llamar a los servlets ServletVender y ServletComprar, y también en estos dos servlets, para pasarlos luego a ServletMain cuando se valide el formulario.