【问题标题】:Does a RequestDispatcher forward maintain the original request's HTTP method?RequestDispatcher 转发是否维护原始请求的 HTTP 方法?
【发布时间】:2009-12-21 14:08:24
【问题描述】:

我想使用 RequestDispatcher 拦截一个请求,然后我想将该请求转发到另一个 servlet —— 像这样:

RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/some.ThirdPartyServlet" + "?" + "param_name=" + "somevalue");
dispatcher.forward(request, response);

如果传入的请求是 POST,请求调度程序会采用我的新参数,并将它们包含在消息正文中,还是现在转发变成 GET?

【问题讨论】:

    标签: jsp servlets


    【解决方案1】:

    它保留原始请求,不改变它。

    因此,如果它是 POST,它将保持 POST。

    【讨论】:

      【解决方案2】:

      我认为您关心的是传入请求 parameters 的可用性(而不是其他人提到的属性)。在这种情况下,您使用转发还是重定向都没有关系。但是,如果您使用转发到另一个Servlet,则将调用与HttpServletRequest#getMethod() 获得的初始请求相关联的适当方法。如果是 POST,则将调用 doPost()。您仍然可以通过HttpServletRequest.getParameter() 以通常的方式访问查询字符串中的附加参数。

      所以在servlet1中基本上如下:

      protected void doPost(HttpServletRequest request, HttpServletResponse response) {
          request.getRequestDispatcher("servlet2?foo=bar").forward(request, response);
      }
      

      基本上可以通过servlet2处理如下:

      protected void doPost(HttpServletRequest request, HttpServletResponse response) {
          String foo = request.getParameter("foo"); // Returns "bar".
      }
      

      【讨论】:

        【解决方案3】:

        如果您使用 forward,则控制权保留在 servlet 容器中,保留请求属性,并且请求保留为 POST。当您使用重定向时,它会导致向浏览器发送响应,从而导致它发出 GET 请求,这就是它丢失原始请求的请求属性的地方,因为 GET 是一个全新的请求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-31
          • 2021-12-23
          • 2012-10-26
          • 1970-01-01
          • 1970-01-01
          • 2015-01-02
          • 2010-09-24
          • 1970-01-01
          相关资源
          最近更新 更多