Red social para profesionales IT

Ingresar
Java

Java

Dudas, soluciones, alternativas, consejos y todo lo que se te pueda ocurrir respecto al lenguaje Java

  • Páginas
  • Java
  • Session tracking y Url Rewriting en servlets

Session tracking y Url Rewriting en servlets


Session tracking y Url Rewriting en servlets

Últimas actualizaciones de hace 2485 dias para Run IT

Categorias: tutorial, Programación

Vamos a hablar de las sesiones en los servlets.  Como todos sabemos o deberíamos, HTTP es un protocolo stateless, osea sin estado; que quiere decir? que el servidor no tiene forma de saber cuando un pedido es del mismo usuario.  El usuario realiza un pedido al servidor, este responde y corta la conección; ya en el próximo pedido el servidor no sabe si es el mismo usuario u otro.  

En el caso de las páginas estáticas no habría problema; el tema se da cuando la página se empieza a personalizar, el usuario tiene sus preferencias y navega por el sitio guardando un estado de lo que ha hecho.

Este seguimiento de lo que hace el usuario en el sitio se conoce con el nombre de seguimiento de Sesión.

Java nos brinda una Api (The Session Tracking API) para abstraernos del problema de realizar el seguimiento del usuario.

Supongamos que el usuario se encuentra en una página de login, se le pide ingresar su usuario y contraseña.  Una vez validado ingresa al sitio, este contiene un escritorio personlizable, donde se puede agregar y quitar  elementos de la pantalla.  Supongamos que el usuario navega dentro del sitio y vuelve a su escritorio; este sigue viendo la personalización que realizó anteriormente, ya que sus preferencias se guardaron en su sesión.  Esto a simple vista parece simple y realmente lo es gracias a la Api de Sesión.

Como funciona?

El método HttpServletRequest.getSession(true) nos devuelve la sesión del usuario que hizo el request al servidor.  El parámetro true, significa que si la sesión no existe ( porque es la primera vez que accede o porque fue invalidada anteriormente) el servidor creará una nueva.  Este método devuelve un objeto HttpSession que representa la sesión del usuario;  entre otras cosas  nos permite almacenar valores del usuario que realizó la petición, mediante el método HttpSession .setAttribute(name, value).  Estos valores se almacenan en un mapa del objeto sesión.  La próxima vez que el mismo usuario haga un request al servidor, podrá utilizar los valores almacenados anteriormente; los puede pedir mediante el método  HttpSession.getAttribute(name)

Esta Api funciona si el navegador tiene activadas las cookies.  En el caso que el usuario desactive las cookies, por cada petición que un mismo usuario haga, el método  HttpServletRequest.getSession(true) nos devolverá siempre una sesión distinta, lo que hace que no podamos realizar un seguimiento de la sesión del usuario!

La sesión que devuelve  HttpServletRequest.getSession(true) posee un Id único que es el que la identifica; este identificará la petición de un mismo usuario hasta que la sesión sea invalidada.

Para ejemplificar lo explicado vamos a hacer dos servlets, una página de inicio con un link a la segunda página; las dos van a mostrar el Id de sesión, si tenemos las cookies activadadas, debería coincidir:

El código del primer servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html"); //seteamos el tipo de respuesta al browser HTML

HttpSession session = request.getSession(true); // tomamos  la sesion que corresponde al

request del usario

PrintWriter out = response.getWriter(); // writer para escribir la respuesta al usuario

out.println("<br>");

out.println("El id de la sesion actual es " + session.getId());

out.println("<br>");

String contextPath = getServletContext().getContextPath();

StringBuffer link = new StringBuffer("<a href=\"")

.append(contextPath).append("/SegundaPagina")

.append("\" >Presione</a> para ir a la segunda pagina");

out.println(link.toString());

out.flush();

}

Si nos fijamos lo único que hace este servlet es tomar la sesión del usuario e imprimir el valor de su id por pantalla.  Luevo agrega un link <a href> con una referencia al segundo servlet, llamado SegundaPagina.  

image

El id impreso en pantalla deberia ser igual al id que va a imprimir el servlet SegundaPagina.  Vemos el código del segundo servlet.

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html");

HttpSession session = request.getSession(true);

PrintWriter out = response.getWriter();

out.println("<br>");

out.println("El valor del id la sesion es "  + session.getId());  //debe ser igual al primer servlet

out.println("<br>");

out.println("Deberia coincidir con el id de la primera pagina si las cookies estan activadas!");

}

 

 

image

Como vemos los ids son iguales, esto quiere decir que el usuario que realizó el pedido al navegar por las páginas es el mismo y podemos realizar un seguimiento de su estado.

Supongamos que el usuario desactiva las cookies, al hacer click en el link a la segunda página el id de la sesión cambia, ya que la Api funciona si las cookies están activadas para poder almacenar el id de sesión.  Bien hay una técnica que se llama Url Rewriting.  En cada link o dirección que especificamos en el servlet, en nuestro caso "<a href="/RunitServlet/SegundaPagina>", debemos utlizar el método HttpServletResponse.encodeURL(url), donde url sería en nuestro caso el link a la segunda pagina.  Este método lo que hace es determinar si el usuario tiene las cookies desactivadas o no; si es así sobreescribe la url que le pasamos y  agrega el parámetro jsessionid='id de la sesión'.

Veamos como se hace.  En el primer servlet debemos cambiar el siguiente fragmento de código:

String contextPath = getServletContext().getContextPath();

StringBuffer link = new StringBuffer("<a href=\"")

.append(response.encodeURL(contextPath+"/SegundaPagina"))

.append("\" >Presione</a> para ir a la segunda pagina");

El único código que agregamos fue (response.encodeURL(contextPath+"/SegundaPagina"), lo que hace es fijarse si las cookies están activadas y agregar si es necesario el id de la sessión para enviarlo en el query string a la segunda página.  Si desactivamos las cookies en el navegador deberíamos ver la url en la segunda página de la siguiente forma.

En la primera página se ve todo igual.

image

Pero en la segunda página vemos que en la url se agrega el parámetro jsessionid=C4BACB5A78EBF19BDEAACF4DB79A36BB, lo que le permite saber al servlet que tiene que usar esa sesión y no crear otra nueva, ya que de no indicarlo se creará una sesión nueva si llamo al método getSession(), por tener las cookies desactivadas.

image

Descargue el código del ejemplo.

Mas información sobre Session Tracking