1

我正在开发一个动态 JSP/Servlet Web 应用程序。为了处理会话,我使用了一个映射/*web.xml. 当我在 Firefox 中打开一个页面时,它会给出以下 Firefox 特定的错误消息:

Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求

Chrome 中显示了类似的错误。这是如何引起的,我该如何解决?

4

1 回答 1

0

您的过滤器正在重定向到一个 URL,该 URL 再次以相同的条件调用相同的过滤器,从而导致新的重定向等。您的过滤器基本上是在无限循环中重定向到自身。Web 浏览器在大约 20 个请求后阻止了无限循环,以将最终用户从设计不良的 Web 应用程序中拯救出来。

您需要相应地修复您的过滤器,使其在已经执行时不执行重定向。让我们假设一个登录过滤器的基本真实世界示例,它映射到/*当用户未登录时,该过滤器应重定向到登录页面,该登录页面由user会话中的属性标识。如果当前请求登录页面本身,您显然希望过滤器不应该重定向到登录页面。

@WebFilter("/*")
public class LoginFilter implements Filter {

    @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 loginURL = request.getContextPath() + "/login.jsp";

        boolean loggedIn = session != null && session.getAttribute("user") != null;
        boolean loginRequest = request.getRequestURI().equals(loginURL);

        if (loggedIn || loginRequest) {
            chain.doFilter(request, response); // Logged-in user found or already in login page, so just continue request.
        } else {
            response.sendRedirect(loginURL); // No logged-in user found and not already in login page, so redirect to login page.
        }
    }

    // ...
}

你看,如果你想允许/继续一个请求,只需调用chain.doFilter()而不是response.sendRedirect(). 仅当您想将请求更改到其他目的地时才使用重定向。

于 2012-12-10T13:15:45.733 回答