【问题标题】:Session time out issue in case of tomcat realm form based authentication在基于 tomcat 领域形式的身份验证的情况下的会话超时问题
【发布时间】:2013-09-19 10:00:07
【问题描述】:

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

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

对应用程序的第一个请求转到 signA.jsp,然后请求被重定向到 auth.jsp(因为此时,用户未通过身份验证)用户所在的位置可以输入登录凭据并点击提交。 Tomcat 将操作作为 j_security_check 获取。一旦身份验证成功并且如果没有错误,请求将返回到 signA.jsp,后者将请求转发到应用程序主页 home.jsp .这工作得很好。

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

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

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

【问题讨论】:

    标签: jsp session tomcat


    【解决方案1】:

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

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

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

    如果一个请求来到/protected/some_other_url 并且你的属性为空,这意味着有一个超时。

    您可以省略 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() {
        }
    
    }
    

    【讨论】:

    • 感谢@acheron55 的回复。我无法将请求从过滤器重定向到登录页面。在会话超时时,我希望将传入的所有 ajax 请求也重定向到登录页面。
    • Tomcat 领域应该只是在超时后将您重定向到登录,而不是过滤。登录后,您通常会被重定向到旧请求,但过滤器会处理该请求并将您重定向到起始页面。我编辑了 response.sendRedirect("/protected/login");这段代码
    猜你喜欢
    • 2014-08-06
    • 2011-09-27
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2016-02-16
    • 2016-08-10
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多