Confusión del tiempo de espera de la sesión: session.setMaxInactiveInterval(0)
-
26-12-2019 - |
Pregunta
Soy nuevo en JEE y esto es lo que me confunde.De acuerdo a HttpSession.html#setMaxInactiveInterval(intervalo int) documentación
Un
interval
valor dezero
o menos indica que el la sesión nunca debe expirar.
pero según mi libro de texto (que ya tiene algunos años, por lo que espero que no siempre sea correcto), usar cero como argumento debería hacer que la sesión se agote inmediatamente.
este codigo
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("foo", 42);
session.setMaxInactiveInterval(0);
out.println(session.getAttribute("foo"));//problem here
}
}
utilizado en Glassfish 4.0 parece confirmar la teoría del libro de texto en lugar de la documentación oficial más nueva porque regresa Estado HTTP 500: error interno del servidor con mensaje de error
java.lang.IllegalStateException: getAttribute: Session already invalidated
¿Que esta pasando aqui?¿Se trata de un error de Glassfish 4.0 o la documentación es incorrecta?¿O tal vez haya una tercera opción?
PD.Este código funciona como debería con valores negativos (la sesión no se invalida) y estoy usando -1
en lugar de 0
en mi código.Sólo estoy interesado en lo que está mal 0
.
Solución
El Especificación de servlet capítulo sobre estados de tiempos de espera de sesión
Por definición, si el período de tiempo libre para una sesión se establece en -1, la sesión nunca caducará.
Entonces GlasshFish parece tener eso cubierto.No puedo encontrar ninguna referencia en la especificación que diga que lo mismo debería ser cierto para un valor de 0
con setMaxInactiveInterval()
.Sin embargo dice
El
session-config
Define los parámetros de sesión para esta aplicación web.El subelementosession-timeout
define el valor predeterminado intervalo de tiempo de espera de sesión para todas las sesiones creadas en esta Web aplicación.El tiempo de espera especificado debe expresarse en un todo número de minutos. Si el tiempo de espera es 0 o menos, el contenedor garantiza el comportamiento por defecto de las sesiones es nunca perder el tiempo.Si este elemento no se especifica, el contenedor debe establecer su período de tiempo de espera por defecto.
Otros consejos
Esto ya es tiempo muerto e invalidado.
session.setMaxInactiveInterval(0); // mean inactive immediately
Entonces este es el mensaje de error correcto.(Consulte el primer libro para obtener más referencias).
Está intentando acceder al valor del objeto que no existe.ya esta destruido