java java-ee servlets web.xml

java - Session TimeOut en web.xml



java-ee servlets (12)

Estoy tratando de comprender el verdadero propósito de la configuración de la sesión en Web.xml para el tiempo de espera de la sesión.

<!-- Session Configuration --> <session-config> <session-timeout>60</session-timeout> </session-config>

Ahora déjame contarte mi pregunta.

Mi aplicación está importando / cargando un archivo .txt, que demorará más de 1 hora, ya que hay millones de registros para importar. Pero la sesión expira después de 1 hora aunque mi aplicación todavía está importando ese archivo .txt que está en progreso. Tal aplicación no debería tener que esperar, ya que la aplicación está realizando una tarea en segundo plano.


Debería considerar dividir el archivo grande en fragmentos y confiar en las capacidades de varios subprocesos para procesar más de un archivo a la vez O dejar que todo el proceso se ejecute como una tarea en segundo plano usando TimerTask y escribir otra consulta para conocer el estado del navegador incluyendo se puede mostrar una barra de progreso si puede conocer el tiempo de proceso de un archivo o registro.


Envíe las solicitudes HTTP de AJAX periódicamente (por ejemplo, una vez cada 60 segundos) a través de javascript para mantener la sesión con el servidor hasta que se complete la carga del archivo.


Establecer un tiempo de espera de sesión que nunca expire no es deseable porque sería confiable para el usuario presionar el botón de cerrar sesión cada vez que haya terminado para evitar que su servidor cargue demasiado (según la cantidad de usuarios y el hardware). Además, hay algunos problemas de seguridad con los que podrías tropezar y que preferirías evitar.

La razón por la cual la sesión se invalida mientras el servidor todavía está trabajando en una tarea es porque no hay comunicación entre el lado del cliente (navegador de los usuarios) y el lado del servidor, por ejemplo, una solicitud http. Por lo tanto, el servidor no puede conocer el estado de los usuarios, cree que está inactivo e invalida la sesión después de la hora establecida en su web.xml .

Para evitar esto, tienes varias posibilidades:

  • Puedes hacer ping a tu back-end mientras la tarea se está ejecutando para tocar la sesión y evitar que caduque
  • aumentar el <session-timeout> dentro del servidor pero no recomendaría esto
  • ejecute su tarea en un hilo dedicado que toca (extiende) la sesión mientras trabaja o notifica al usuario cuando el hilo ha terminado

Hubo una pregunta similar, quizás pueda adaptar partes de esta solución en su proyecto. Echa un vistazo a this .

Espero que esto ayude, diviértete!


Hacky manera:

Podría aumentar el tiempo de espera de la sesión programáticamente cuando se espera una gran descarga / descarga.

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)

Cuando el proceso finaliza, puede establecer el tiempo de espera en su valor predeterminado.

Pero ... cuando está en Java EE, y la actualización / descarga no toma una hora completa, la mejor manera era ejecutar las tareas de manera asíncrona (a través de JMS, por ejemplo).


Los documentos dicen:

El elemento session-timeout define el intervalo de tiempo de espera de sesión predeterminado para todas las sesiones creadas en esta aplicación web. El tiempo de espera especificado debe expresarse en un número entero de minutos. Si el tiempo de espera es 0 o menos, el contenedor garantiza que el comportamiento predeterminado de las sesiones nunca expire. Si no se especifica este elemento, el contenedor debe establecer su período de tiempo de espera predeterminado.


Otra opción que recomendaría es crear una aplicación independiente sin estado que tome el archivo grande. En su aplicación principal, abra una nueva ventana o un iframe que acepte el archivo y lo envíe a través de esa ventana, luego oculte la ventana o el iframe una vez que la carga haya comenzado a usar Javascript.


Por lo general, la sesión no caducará cuando se realice el procesamiento de la solicitud. Creo que hay un LB o algo intermedio que lee todo el archivo y luego invoca el contenedor web.

Esto podría estar causando un retraso que lleva a la expiración de la sesión.


Puede ver muchas opciones como respuesta a su pregunta, sin embargo, puede usar "-1" donde la sesión nunca expira. Ya que no sabe cuánto tiempo le tomará al hilo completarlo. P.ej:

<session-config> <session-timeout>-1</session-timeout> </session-config>

O si no quiere que suceda un tiempo de espera con algún propósito:

<session-config> <session-timeout>0</session-timeout> </session-config>

Otra opción podría ser aumentar el número a 1000, etc., etc., bla, bla, bla.

Pero si realmente desea detenerse y considera que no es necesario que su aplicación obligue al usuario a desconectarse, simplemente agregue un botón de desconexión y el usuario decidirá cuándo irse.

Esto es lo que puede hacer para resolver el problema si no necesita obligarlo a cerrar la sesión, y si está cargando archivos que podrían llevar su base de tiempo en el servidor y la velocidad de su computadora y el tamaño del archivo.

<!-- sets the default session timeout to 60 minutes. --> <!-- <session-config> <session-timeout>60</session-timeout> </session-config> -->

Solo coméntelo o elimínelo ¡eso es todo! Tan tararantan, tan bronceado!


Si no quiere que suceda un tiempo de espera para algún propósito:

<session-config> <session-timeout>0</session-timeout> </session-config>

Debe resultar en ningún tiempo de espera en absoluto -> infinito


puedes declarar el tiempo de dos maneras para este problema ...

1) o le dan demasiado tiempo para que la lectura de su archivo se complete entre ese momento.

<session-config> <session-timeout> 1000 </session-timeout> </session-config>

2) declare el tiempo que nunca expira su sesión.

<session-config> <session-timeout>-1</session-timeout> </session-config>


<session-config> <session-timeout>-1</session-timeout> </session-config>

En el código anterior "60" stands for the minutes. La sesión expirará después de 60 minutes. Entonces, si quieres tener más tiempo. Para el ejemplo -1 que se describe, su sesión nunca expira.


<session-config> <session-timeout>-1</session-timeout> </session-config>

Puedes usar "-1" donde la sesión nunca expira. Ya que no sabe cuánto tiempo le tomará al hilo completarlo.