El objeto de Java HttpSession es uno de los más utilizados en aplicaciones web ya que continuamente necesitamos almacenar información que este viva para un usuario concreto mientras este maneja la aplicación y se mueve a través de las distintas páginas.
En estas situaciones nos encontramos que es clave saber cuanto tiempo esta viva una session determinada. Esto se configura normalmente a través del web.xml con las siguientes etiquetas.
<session-config> <session-timeout>30</session-timeout> </session-config>
El Tomcat tiene configurado por defecto un timeout de 30 minutos. Sin embargo en muchas ocasiones queremos modificarlo ya sea para bajarlo y reducir el timeout como para subirlo,dependerá mucho del tipo de aplicaciones.
Ahora bien este tipo de configuración aunque es muy sencilla tiene una serie de limitaciones la más importante es que trata a todas las sessiones de todos los usuarios por igual. Quizás esto no sea lo que deseemos ya que hay situaciones que la sessión de un usuario normal es razonable que dure 30 minutos pero la session de un administrador debe durar solo 5. ¿Como abordamos este problema?.
Para personalizar el tiempo de timeout de un usuario concreto podemos atacar directamente al objeto HttpSession y a su método setMaxInactiveInverval(int segundos) que nos permite configurar el tiempo de timeout de forma individual para cada usuario (en segundos) vamos a verlo en código:
package com.arquitecturajava; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet("/Servlet1") public class Servlet1 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session=request.getSession(); session.setMaxInactiveInterval(60); session.setAttribute("nombre", "pedro"); } }
Este primer servlet almacena un objeto de tipo String (“nombre”) en la session pero modifica su tiempo de timeout para que solo dure 60 segundos. Usaremos otro servlet para leer la información.
package com.arquitecturajava; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet("/Servlet1") public class Servlet1 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Servlet1() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session=request.getSession(); String nombre=session.getAttribute("nombre", "pedro"); PrinWriter pw=response.getWriter(); pw.println(nombre); } }
Este segundo servlet nos imprimirá los datos almacenados en la session por pantalla pero en vez de durar la session 30 minutos únicamente durará 60 segundos (un minuto) una vez pasado el minuto los datos se perderán.
De esta forma tendremos un control mucho más a detalle de la gestión de sesiones.
Otros artículos relacionados : El concepto de HttpSession , Manejando ServletContextListener
Cecilio,
Comencé a usar sesiones porque tengo que pasar entre páginas id para hacer modificaciones en la base de datos.
Una consulta, como puedo hacer para que cuando finaliza el tiempo de la sesión, avisarle al usuario con un alerta? porque hay veces que finaliza y cuando quieren acceder a la base de datos con ese id que está en la sesión, explota todo?
Saludos
Puedes controlar el error con la pagina de error de JSP ante un evento de finalización de session
Hola quisiera poner en 0 a todas las paginas en session time out, como lo puedo hacer. ¿Con un WebFilter?
En session timeout en el web.xml le puedes poner a 1 minuto
Hola amigo, conoces alguna forma de evitar el time-out sobre eventos onkey o keydown, porque mientras no invocas otra direccion URL ‘HttpSession-timeout’ lo interpreta como si ya no hubiera alguna actividad y me termina la sesión. No encontré alguna solución al respecto
Hace poco detecte ese problema en un sistema que hice en spring, de momento lo he corregido aumentando el time-out del web.xml y reduciendo un timer de jQuery que estoy usando para alertar la inactividad.
Saludos.
La session depende puramente del servidor si no haces ninguna petición la cierra , para mantenerla abierta sería suficiente o cambiar el tiempo de timeout o realizar una peticion ajax cada x tiempo al servidor
Saludos Cecilio, en una web bajo Spring MVC realizo peticiones AJAX cada minuto para refrescar información. ¿Cómo puedo evitar que dicha consulta mantenga abierta la sesión?
Quizás con algo así , no lo he probado la verdad https://memorynotfound.com/disable-http-session-web-application/
Que tal, y como puedo hacer para capturar el evento cuando termine la sesión y redirigir a una pagina de error por ejemplo.
He intentado solo poniendo en el web.xml:
15
javax.faces.application.ViewExpiredException
/pages_error/sesionExpired.jsf
Pero no funciona.
Te agradecería si me ayudas con esto.
”
15
javax.faces.application.ViewExpiredException
/pages_error/sesionExpired.jsf
“
Deberías usar un filtro , aunque depende mucho del framework que uses 🙂 .Hay frameworks que ofrecen sus propias soluciones
Que tal, como podría acceder a todos las sesiones?, y a la vez poder eliminar una sesión de un usuario especifico?
Gracias.
Pues almacenando sus referencias en el servletContext, pero date cuenta que eso implicaría un riesgo de seguridad ya que desde un usuario se podría acceder a datos de otros
Hola muy bueno pero yo quisiera poner lo mismo en Spring Framework mediante Java Configuration por codigo no por xml
Eso se configura a nivel a nivel de xml en el web.xml para conseguir una configuracón similar en Spring deberías probablemente en Spring MVC cambiar el gestor de sessiones
¿cómo le puedo hacer para que nunca se acabe la sesión?
En el web.xml asignar -1 al timeout de session
La mejor solución sería usar un WebListener que dentro de los métodos de eventos personalice la session a medida por ejemplo usando request.isUserInRole
¿No sería más correcto usar un @WebListener que implemente HttpSessionListener?
Si pero no. Porque el weblistener afecta a todas las sessiones que tengas . Mientras que este afecta a una session en concreto y es más configurable. Si solo necesitas lo generico este ejemplo no es necesario
Hola amigo buenas tardes como aria para que el session no expire estoy trabajando con jsf
cambia en el web.xml el timeout a -1
El código del segundo servlet es igual que el del primero salvo por el constructor o es que ya es muy tarde y morfeo me confunde? 🙂
Muchas gracias en cualquier caso por el post
Muchas gracias por la correccion 🙂