我正在开发一个动态 JSP/Servlet Web 应用程序。为了处理会话,我使用了一个映射/*
在web.xml
. 当我在 Firefox 中打开一个页面时,它会给出以下 Firefox 特定的错误消息:
Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求
Chrome 中显示了类似的错误。这是如何引起的,我该如何解决?
我正在开发一个动态 JSP/Servlet Web 应用程序。为了处理会话,我使用了一个映射/*
在web.xml
. 当我在 Firefox 中打开一个页面时,它会给出以下 Firefox 特定的错误消息:
Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求
Chrome 中显示了类似的错误。这是如何引起的,我该如何解决?
您的过滤器正在重定向到一个 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()
. 仅当您想将请求更改到其他目的地时才使用重定向。