Servlets 映射到/*的Servlet筛选器导致浏览器错误;服务器正在以一种永远不会完成的方式重定向对此地址的请求;
我正在开发一个动态JSP/Servlet web应用程序。为了处理会话,我使用了一个映射到Servlets 映射到/*的Servlet筛选器导致浏览器错误;服务器正在以一种永远不会完成的方式重定向对此地址的请求;,servlets,redirect,browser,servlet-filters,Servlets,Redirect,Browser,Servlet Filters,我正在开发一个动态JSP/Servlet web应用程序。为了处理会话,我使用了一个映射到web.xml中/*的过滤器。当我在Firefox中打开页面时,它会给出以下特定于Firefox的错误消息: Firefox检测到服务器正在以一种永远无法完成的方式重定向对此地址的请求 Chrome中也显示了类似的错误。这是如何导致的,我如何解决它?您的筛选器正在重定向到一个URL,该URL再次以相同的条件调用相同的筛选器,从而导致新的重定向,等等。过滤器基本上是在无限循环中重定向到自身。webbrowse
web.xml
中/*
的过滤器。当我在Firefox中打开页面时,它会给出以下特定于Firefox的错误消息:
Firefox检测到服务器正在以一种永远无法完成的方式重定向对此地址的请求
Chrome中也显示了类似的错误。这是如何导致的,我如何解决它?您的筛选器正在重定向到一个URL,该URL再次以相同的条件调用相同的筛选器,从而导致新的重定向,等等。过滤器基本上是在无限循环中重定向到自身。webbrowser在大约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()
。仅当要将请求更改为其他目标时,才使用重定向