在基于tomcat领域表单的身份验证的情况下,会话超时问题

时间:2013-09-19 10:00:08

标签: jsp session tomcat

我正在使用Tomcat(7.0.34)领域的基于表单的身份验证。我的问题描述如下。

我有 signA.jsp 这是一个受保护的页面。然后我有 auth.jsp 这是登录页面。

第一个应用程序请求转到 signA.jsp ,然后请求被重定向到 auth.jsp (此时用户未经过身份验证)用户所在的位置可以输入登录凭据并点击提交。 Tomcat以j_security_check.Once成功进行身份验证,如果没有错误,请求将返回 signA.jsp ,并将请求转发到应用程序主页 home.jsp 。这完全没问题。

如果验证失败,请求将转到 errorA.jsp 文件,该文件将请求重定向到 signA.jsp 以及statusId作为get参数,并且请求是再次重定向到 auth.jsp

现在,假设我在页面 C.jsp 上时登录到应用程序和会话超时,然后当我单击导航到其他应用程序页面时,请求重新开始 - 导向 auth.jsp 实际上很好。但是当再次尝试重新登录时,我发现请求转到上一个登录会话中最后访问的页面,在这种情况下,它是 C.jsp 。理想情况下,我希望登录后通过第一个默认页面的请求是 home.jsp ,其中我保留了在整个应用程序中使用的登录详细信息和会话中的其他详细信息。

知道可能是什么问题吗?如果您能为我提供解决此问题的解决方案,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

我有类似的问题。挖了几个小时,想出了一些黑客的解决方案。

在你的会话对象中(通过调用.isNew()等),你无法判断是否有超时,因为如果有超时,tomcat领域将会创建一个新的会话。因此,您需要在成功登录时在会话中设置属性。

在受保护的网址上添加过滤器。不要忘记将其添加到web.xml。 假设您的登录Servlet位于/protected/login下,其他所有请求都将/protected/some_other_url

如果请求来到/protected/some_other_url并且您的属性为null,则表示存在超时。

您可以省略path.startsWith检查过滤器的url模式是否正确,或者登录servlet可能位于不同的前缀等等。你明白了。

public class TimeoutFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        String path = request.getServletPath();

        // login after timeout occurred
        if (session != null && session.getAttribute(YOUR_ATTRIBUTE) == null && path.startsWith("/protected") && !path.equals("/protected/login")) {
            response.sendRedirect("/protected/YOUR_START_PAGE");
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }

}