Tiempo de espera de la sesión al actualizar en la página de inicio de sesión

hice una muy simple inicio de sesión y sesión estructura para su reutilización en mis futuras aplicaciones basadas en JSP. Es como esto:

web.xml (el tiempo de espera de 1 minuto es para probar mi problema):

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

<filter>
 <filter-name>Access</filter-name>
 <filter-class>com.app.Access</filter-class>
</filter>

<filter-mapping>
 <filter-name>Access</filter-name>
 <url-pattern>*</url-pattern>
</filter-mapping>

<servlet>
 <servlet-name>Login</servlet-name>
 <servlet-class>com.app.Login</servlet-class>
</servlet>

<servlet-mapping>
 <servlet-name>Login</servlet-name>
 <url-pattern>/login</url-pattern>
</servlet-mapping>

Acceso.java filtro:

// Check if the page's the login or if the user logged, else asks login
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    boolean logged = httpRequest.getSession(false) != null && httpRequest.getSession().getAttribute("user") != null;
    if (httpRequest.getServletPath().equals("/login") || logged)
        chain.doFilter(request, response);
    else
        ((HttpServletResponse) response).sendRedirect(httpRequest.getContextPath() + "/login");
}

Login.java servlet (autenticación abreviada para prueba):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid())
        request.setAttribute("failure", "session timeout");
    request.getSession().setAttribute("user", null);
    request.getRequestDispatcher("login.jsp").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getSession().setAttribute("user", new User());
    response.sendRedirect("");
}

En los iniciar sesión.jsp página, en la raíz de WebContent, tiene un <form action="login" method="post"> formulario con innerHTML apropiado para la autenticación y un ${fracaso} campo para recibir un hora de término de la sesión o un error de inicio de sesión mensaje.

Esta estructura funciona perfectamente para mí. Intercepta, solicita inicio de sesión, verifica tanto la sesión como la autenticación, etc., pero hay una pequeña falla: si está en la página de inicio de sesión y la actualiza (ya sea F5 o presionando Entrar en la URL) después del tiempo de espera, la página recibe y muestra el mensaje de "tiempo de espera de la sesión" en ${fallo}.

Todavía no encontré una forma de trabajo real para hacer saber que la página anterior era la página de inicio de sesión. Intenté unas cinco formas diferentes sin éxito, incluyendo request.getHeader("Referer") y del lastWish biblioteca de etiquetas.

preguntado el 01 de julio de 12 a las 02:07

2 Respuestas

Una forma es permitir que sus JSP de acceso público (como la página de inicio de sesión) no crear la sesión en absoluto. Solicitar una página JSP crea implícitamente la sesión de forma predeterminada. Esto se puede lograr agregando la siguiente línea en la parte superior de JSP:

<%@page session="false" %>

De esta manera request.getRequestedSessionId() regresará null y, por lo tanto, se omitirá la verificación de tiempo de espera. De esta manera, la sesión solo se creará cuando realmente inicie sesión con el usuario. Solo eliminaría la siguiente línea del servlet ya que no tiene sentido y aún así crearía la sesión:

request.getSession().setAttribute("user", null);

Respondido 01 Jul 12, 02:07

¡No sabía que se podía hacer algo así! Agregué eso para restablecer al usuario en caso de que llegara a la página de inicio de sesión manualmente, pero con su solución prefiero eliminar eso. ¡Muchas gracias, BalusC! - usuario1493676

Eres bienvenido. Como eres nuevo aquí, no olvides marcar la respuesta aceptada siempre que haya ayudado (más) a resolver el problema concreto. Ver también ¿Cómo funciona aceptar una respuesta? - BalusC

@Trevor: Buen caso extremo. Por lo general, en el sitio web promedio que se respeta a sí mismo, un usuario que ya inició sesión no vería ningún enlace de "inicio de sesión" (ya que eso es confuso en la perspectiva de UX) y cualquier intento de visitarlo forzando la URL o siguiendo un enlace / marcador resultaría en una redirección a la página principal, tal vez con un mensaje de "Ya estás conectado". Para esa redirección, se podría usar un filtro (tal vez el mismo filtro de autenticación que probablemente ya esté usando). - BalusC

Buenos consejos, trabajaré para implementar eso también en mi estructura. Por cierto, te juro que había marcado la respuesta, ¡perdón por eso! - usuario1493676

Solo lo hago así:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpReq = (HttpServletRequest)request;
    String servletPath = httpReq.getServletPath();
    HttpSession session = httpReq.getSession();
    String redirectUrl = "/login.jsp";
    if (
            (servletPath.endsWith("login.jsp")) ||
            (servletPath.endsWith("rss.html")) ||
            (servletPath.endsWith("httperror403.html")) ||
            (servletPath.endsWith("httperror500.html")) ||
            (servletPath.endsWith("imageMark.do"))||
            (servletPath.indexOf("/api.do") != -1) ||
            (servletPath.indexOf("/help/") != -1)){
        chain.doFilter(request, response);
    }  else if (session == null) {
        httpReq.getRequestDispatcher(redirectUrl).forward(request, response);
    } else {
        SystemUser user = (SystemUser)session.getAttribute("user");
        if (user == null){
            if (session != null){
                session.invalidate();
            }
            httpReq.getRequestDispatcher(redirectUrl).forward(request, response);
        } else {
            chain.doFilter(request, response);
        }
    }
}

Respondido 01 Jul 12, 02:07

¿Cómo responde exactamente esto a la pregunta concreta de OP? Por cierto, hay una falla lógica en tu código. El session is nunca null en esta construcción. - BalusC

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.