dispatcher.forward 导致死循环
dispatcher.forward causes infinite loop
我正在尝试执行以下操作:我创建一个 servlet 来处理所有请求,如果 url 包含单词 "hello",则将响应代码设置为 403,否则转发请求 html 页面。这是我的 servlet:
@WebServlet("/*")
public class AllRequestsHandlerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = request.getRequestURL().toString();
if(url.contains("hello")) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
} else {
RequestDispatcher dispatcher = request.getRequestDispatcher("/static-html-page.html");
dispatcher.forward(request, response);
}
}
}
但是转发之后,由于这个servlet也要处理转发的请求,导致死循环。我怎样才能避免这种情况?
这永远行不通,因为 /*
映射到每个请求 - 包括您转发到 /static-html-page.html
并且路径映射优先于所有其他映射。
有几种解决方法。最简单的(假设网络应用程序中没有其他内容)是:
- 将
/static-html-page.html
重命名为 /static-html-page.jsp
- 将映射从
/*
更改为 /
这意味着 /static-html-page.jsp
可以直接访问。如果您不想这样,请将其移至 /WEB-INF
下方。 request.getRequestDispatcher("/WEB-INF/static-html-page.html")
仍然有效。
我正在尝试执行以下操作:我创建一个 servlet 来处理所有请求,如果 url 包含单词 "hello",则将响应代码设置为 403,否则转发请求 html 页面。这是我的 servlet:
@WebServlet("/*")
public class AllRequestsHandlerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = request.getRequestURL().toString();
if(url.contains("hello")) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
} else {
RequestDispatcher dispatcher = request.getRequestDispatcher("/static-html-page.html");
dispatcher.forward(request, response);
}
}
}
但是转发之后,由于这个servlet也要处理转发的请求,导致死循环。我怎样才能避免这种情况?
这永远行不通,因为 /*
映射到每个请求 - 包括您转发到 /static-html-page.html
并且路径映射优先于所有其他映射。
有几种解决方法。最简单的(假设网络应用程序中没有其他内容)是:
- 将
/static-html-page.html
重命名为/static-html-page.jsp
- 将映射从
/*
更改为/
这意味着 /static-html-page.jsp
可以直接访问。如果您不想这样,请将其移至 /WEB-INF
下方。 request.getRequestDispatcher("/WEB-INF/static-html-page.html")
仍然有效。