Você está na página 1de 4

Las sesiones en el protocolo HTTP HTTP es un protocolo sin estado (stateless), cada peticin al servidor web y su correspondiente respuesta

es manejada como una transaccin aislada. El servidor (HTTP) no tiene manera de determinar que una serie de peticiones provienen del mismo cliente. Las sesiones, en una aplicacin web, se utilizan para asociar las peticiones con el cliente. Una sesin comienza cuando un cliente desconocido enva la primera peticin (que requiera crear una sesin) a la aplicacin web. La misma finaliza, cuando el cliente la termina explcitamente o cuando se expira el tiempo de vida de la sesin (debido a que no se ha recibido una peticin en un tiempo determinado). La manera en que una aplicacin web mantiene una sesin con el cliente es: Cuando el servidor web recibe la primera peticin de un cliente, el servidor inicia una sesin y le asigna un identificador nico. El cliente debe incluir este identificador nico en cada peticin subsecuente. El servidor revisa el identificador y asocia la peticin con su correspondiente sesin. Existen dos formas de implementar el soporte para sesiones, cookies y la sobreescritura de la URL.

javax.servlet.http.HttpSession La API de servlets abstrae el concepto de sesin a travs de esta interface. Cuando se inicia una sesin para un cliente, el contenedor de servlets instancia un objeto HttpSession. Los distintos servlets pueden utilizar este objeto para almacenar informacin relacionada al usuario y de esta manera mantener el estado del mismo. Existe un objeto HttpSession por cada sesin (o usuario). El contenedor de servlets se encarga de asociar una peticin con su correspondiente objeto de sesin. La interface javax.servlet.http.HttpServletRequest provee dos mtodos para obtener la sesin: HttpSession getSession (boolean create): Devuelve el correspondiente objeto sesin, o si no existe ninguna sesin y el parmetro sesin es true, crea una nueva sesin. HttpSession getSession (): Mtodo equivalente a invocar getSession (true). Mtodos de la interface HttpSession para el manejo de sus atributos: void setAttribute (String name, Object value): Asocia el objeto pasado como parmetro a la sesin, y lo identifica a travs del nombre. Object getAttribute (String name): Devuelve el objeto asociado al nombre, o null en caso de no existir ninguno.

Manejando los eventos de sesin con las interfaces listener En una aplicacin web, cuando ocurren eventos importantes, se pueden recibir las notificaciones correspondientes a los mismos a travs de las interfaces listener. Se crea una clase que implemente la interface listener correspondiente, y el contenedor de servlets invocar los mtodos apropiados sobre un objeto (de esta clase) cuando ocurra algn evento. La API de servlets define cuatro interfaces listener y dos eventos relacionados a las sesiones dentro de javax.servlet.http: HttpSessionAttributeListener: Permite recibir notificaciones cuando se agrega, reemplaza, o elimina un atributo de un objeto HttpSession. La clase se debe especificar en el archivo web.xml. El contenedor de servlets solo crea una instancia, sobre la cual se invocaran los mtodos para todas las sesiones. void attributeAdded (HttpSessionBindingEvent sbe): Invocado cuando se agrega un atributo a una sesin. void attributeRemoved (HttpSessionBindingEvent sbe): Invocado cuando se elimina un atributo. void attributeReplaced (HttpSessionBindingEvent sbe): Invocado cuando se reemplaza un atributo. HttpSessionBindingListener: Esta interface es implementada por aquellas clases cuyos objetos necesiten recibir notificaciones de cuando ellos son agregados y eliminados de una sesin. Esta clase no se especifica en el archivo web.xml. Cuando se agrega o elimina un objeto de una sesin, el contenedor revisa las interfaces que implementa. En caso de que el objeto implemente la interface HttpSessionBindingListener, el contenedor invoca el mtodo correspondiente: void valueBound (HttpSessionBindingEvent event): Notifica al objeto que est siendo asociado a una sesin. void valueUnbound (HttpSessionBindingEvent event): Notifica al objeto que est siendo desasociado de una sesin. HttpSessionListener: Esta interface se utiliza para recibir notificaciones de cuando una sesin se crea o se destruye. La clase que implemente dicha interface debe ser especificada en el archivo web.xml. Se crea una nueva instancia de esta clase, por cada nueva sesin creada. Posee los mtodos: void sessionCreated (HttpSessionEvent se): Se invoca cuando se crea una sesin. void sessionDestroyed (HttpSessionEvent se): Se invoca cuando se destruye una sesin. Si dentro de este mtodo se invoca el mtodo getAttribute(), se lanza la excepcin IllegalStateException.

HttpSessionActivationListener: (No se requiere para el examen) Esta interface se utiliza por los atributos de una sesin, para recibir notificaciones de cuando la sesin est siendo migrada a travs de JVMs en un ambiente distribuido. De esta manera, los atributos contenidos en una sesin no se pierden, ms all de que exista ms de una JVM ejecutando la aplicacin. Posee los mtodos: void sessionDidActivate (HttpSessionEvent se): Se invoca justo despus de que la sesin se activa. void sessionWillPassivate (HttpSessionEvent se): Se invoca antes de desactivar la sesin. Cerrar sesiones La interface HttpSession provee el mtodo: void invalidate(): Cierra una sesin y desenlaza todos los objetos asociados a ella. Lanza la excepcin IllegalStateException si la sesin ya ha sido cerrada. Session timeout El protocolo HTTP no provee ninguna seal de la terminacin de una sesin en el servidor. Por este motivo, cuando el usuario no realiza ninguna accin en un perodo de tiempo determinado, el servidor cierra dicha sesin. En el archivo web.xml, el elemento <session-timeout> contiene en minutos el tiempo de vida de una sesin. Un valor 0 o menor significa que la sesin nunca expirar. 1.<web-app =""> 2.<session-config> 3.<session-timeout>30</session-timeout> 4.</session-config> 5.</web-app> La interface HttpSession tambin posee los siguientes mtodos: void setMaxInactiveInterval (int seconds): Afecta solo a la sesin en la cual se invoca. Las dems, mantienen el tiempo especificado en el archivo web.xml. void getMaxInactiveInterval () Existen dos inconsistencias entre estos modos de setear el timeout: El valor de elemento <session-timeout> se especifica en minutos, mientras que setMaxInactiveInterval() en segundos. El valor 0 o menos en el elemento <session-timeout> significa que la sesin nunca expirar, mientas que al mtodo setMaxInactiveInterval() se le debe pasar un valor negativo (no 0) para conseguir el mismo comportamiento.

Utilizacin de cookies En esta tcnica, para enviar y recibir el identificador de una sesin, el contenedor de servlets utiliza los encabezados (headers) HTTP. Cuando se devuelve la respuesta, el contenedor agrega un encabezado especial que contiene el identificador de sesin. El cliente, el cual es tpicamente un browser, extrae este encabezado especial, y lo almacena en la mquina local. Cuando se realiza otra peticin, el cliente agrega automticamente un encabezado que contiene el identificador de sesin almacenado. Este archivo almacenado se denomina cookie. Cuando las cookies se encuentran deshabilitadas, el browser ignora cualquier encabezado que contenga cookies, y consecuentemente no enva ningn encabezado con cookies en la peticin.

Sobreescritura de URLs Esta alternativa permite aadir, dentro de una respuesta, el identificador de sesin en todas las URLs. De esta manera, cuando el usuario interacte con el sitio, enviar automticamente su identificador de sesin como parte de la peticin. Este mecanismo no es tranparente al desarrollador (a diferencia de las cookies). La interface HttpServletResponse provee los mtodos: String encodeURL (String url): Devuelve la url con el identificador de sesin adjuntado. String encodeRedirectURL (String url): Idem anterior, pero se utiliza junto con el mtodo sendRedirect(). Ambos mtodos verifican si es necesario adjuntar el identificador. Si la peticin contiene un encabezado de cookie, entonces las mismas estn habilitadas en el browser cliente, y la sobreescritura de la url no es necesaria. Se debe tener en cuenta que en la URL, el ID de la sesin se agrega luego del carcter ;. Por ejemplo: http://localhost:8080/scwcd/LoginServlet;jsessionid=1C9B3BAE94BE88AD45AA54B2A8AC0246 ?user=matias Esto se debe a que jsessionid es parte del path info de la peticin, y no es un parmetro de la misma. Este valor NO puede ser accedido a travs del mtodo HttpServletRequest.getParameter(jsessionid).

Você também pode gostar