JSP forward和redirect的区别

75
请解释 jsp:forwardredirect 的区别。每种情况下会发生什么?

1
(在Spring MVC中)如果我返回一个没有任何前缀的视图名称,那么它被认为是一个forward吗? - modeller
7个回答

149
  • redirect 会将响应状态设置为302 [1],并在 Location 头中设置新的URL,然后将响应发送到浏览器。根据HTTP规范,浏览器会对新的URL发出另一个请求。

  • forward 完全在服务器上进行。Servlet容器只是将相同的请求转发到目标URL,而浏览器并不知道这一点。因此,在处理新的URL时可以使用相同的请求属性和参数。而且浏览器不会知道URL已经改变了(因为这完全是在服务器上完成的)。


[1]: 这是行业实践与标准相矛盾的一个例子。HTTP/1.0 规范(RFC 1945) 要求客户端执行临时重定向(原始描述短语为“暂时移动”),但流行的浏览器使用 302 来实现 303 See Other 的功能。因此,HTTP/1.1 添加了状态码 303 和 307 来区分这两种行为。但是,一些 Web 应用程序和框架将 302 状态码用作如果它是 303。来源


1
前进时URL会改变吗?我读到的是URL将保持不变。 - Ammu
5
是的,它会保持不变,因为浏览器不知道这个改变。 - Bozho

47

我听到了关于重定向和转发的有趣解释。想象一下,你需要从朋友那里获得某项服务,不管是什么样的服务。假设你的朋友不能帮助你,但他知道谁可以。

如果他将告诉你:“我无法处理这个请求,但我知道谁能够帮你,这是他的电话号码,请给他打电话。”,此时他将会 REDIRECT 你的请求。

如果他将告诉你:“没问题”,并且在未通知你的情况下为你联系另一个人来处理你的需求,那么他将会 FORWARD 你的请求。然后,你的朋友将得到处理你的愿望的结果,并将其传递给你。


12

与转发(forward)相比,重定向(Redirect)速度较慢,因为它必须经过浏览器并等待浏览器发出新请求,因此导致请求范围内的对象在重定向后不可用。


6

重定向:

  1. 用户请求一个资源。
  2. 响应被发送给用户。
  3. 这不是请求的资源,这是带有HTTP代码302且包含所请求资源的URL的响应。
  4. URL可能与请求的URL相同或不同。
  5. 客户端浏览器再次使用新URL请求资源,这次将发送实际资源给用户。

转发:

它是仅在服务器端显示所请求的资源的过程。


3

这篇文章提供了一个非常好的解释,使用一个很好的现实世界的例子来区分转发和重定向。

牛奶送货员来到你家里向你要求月付款。 在这里,房子是容器,你是存在于容器中的资源。牛奶送货员是客户端或浏览器。

他要求向你支付月费,这就是浏览器对资源A的请求。如果你进入自己的房子并向你母亲(容器中的另一个资源B)要现金,然后回来交给牛奶送货员,这就是转发。

如果你让牛奶送货员自己与你家中的母亲交谈,或者让牛奶送货员与在他办公室(不同域)的你父亲交谈,那么这就是重定向。


1
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
|                             Forwards   vs.                              |                                  Redirects                                  |
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
| ServletContext.getRequestDispatcher(location).forward(request,response) | httpServletResponse.sendRedirect(location)                                  |
| Communication between pages directly                                    | Communication b/w pages are indirectly by extra round trip from HTTP client |
| Communication happens within web-container                              | Communication happens outside web-container                                 |
| Use same Request and Response Object                                    | Use different Request and Response Object                                   |
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+

0
当您转发请求时,
- 请求和响应对象被传输。 - URL保持不变。
当您将请求重定向到另一个JSP / servlet时,
- 请求和响应对象不会传输到新对象。 - URL更改为新页面的目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接