【问题标题】:dispatcher.forward causes infinite loopdispatcher.forward 导致无限循环
【发布时间】:2019-07-01 18:52:58
【问题描述】:

我正在尝试执行以下操作:我创建一个 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 也处理转发的请求,它会导致一个无限循环。我怎样才能避免这种情况?

【问题讨论】:

标签: java jsp servlets


【解决方案1】:

这永远不会起作用,因为 /* 映射到每个请求 - 包括您转发到 /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") 仍然有效。

【讨论】:

  • 谢谢,将映射从 /* 更改为 / 并将文件从 .html 重命名为 .jsp 有效,但为什么我必须将我的文件设为 jsp 文件?如果我将文件扩展名保留为 html,它仍然会导致无限循环。
  • 归结为哪个映射优先。 JSP 由使用 *.jsp 扩展映射的 JSP servlet 提供服务。扩展映射的优先级高于默认映射。如果您不重命名 html 文件,它将与默认映射匹配,因此您将获得无限循环。查看 servlet 规范的第 12.2 节,并记住静态文件通常由映射到 / 的 Tomcat 的默认 servlet 提供服务。
猜你喜欢
  • 2020-08-27
  • 2021-05-07
  • 2012-08-24
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多