JSP 转发和重定向之间的区别

请解释 jsp:forwardredirect之间的区别。
每种情况下都发生了什么?

79921 次浏览
  • Redirect 将响应状态设置为302[1] ,并在 Location头中设置新的 url,然后将响应发送给浏览器。然后,根据 http 规范,浏览器向新的 URL 发出另一个请求

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


[1] : 这是一个行业惯例与标准相抵触的例子。 HTTP/1.0规范(RFC 1945)要求客户端执行 临时重定向(原来的描述短语是 ) ,但流行的浏览器使用 因此,HTTP/1.1添加了状态 编码303和307来区分这两种行为, 一些 Web 应用程序和框架使用302状态代码就好像 是303。 < a href = “ https://en.wikipedia.org/wiki/HTTP _ 302”rel = “ noReferrer”> Source

与转发相比,重定向也更慢,因为它必须通过浏览器并等待浏览器发出新请求,因此导致重定向后请求范围对象不可用。

重定向:

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

前进:

这是一个简单地向用户显示所请求的资源的过程,它完全发生在服务器端。

我听过有关重定向和前进的有趣解释。想象一下你需要朋友的服务。什么服务不重要。假设你的朋友帮不了你,但是他知道谁可以。

如果他告诉你: “我不能处理这件事,但我知道谁能。这是他的电话号码。给他打电话”

如果他告诉你: “没问题”,他会转达你的请求,然后自己给那个人打电话,而不会通知你让另一个人来处理你的欲望。然后,你的朋友将得到的结果整理出你的愿望,并传递给你。

这篇文章 用一个很好的现实例子对转发和重定向做了很好的解释。

送牛奶的人来到你家,要求你每月付款。 这里的房子是容器,你是一个资源存在于 牛奶人是客户或浏览者。

他要求每月付款给你,这是要求由 如果你走进你的房子,问你的 母亲(同一容器内的另一资源 B)的现金和 回来给送牛奶的人送这个叫做前进。

如果你让送牛奶的人在你的房间里和你妈妈说话 或者你让送牛奶的人和你父亲谈谈 Office (不同的域)则称为重定向。

当你转发请求时,

- 请求和响应对象被转移。 网址保持不变。

当您将请求重定向到另一个 JSP/servlet 时,

- 请求和响应对象不会转移到新对象。 - Url 更改为新页面的目录。

+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
|                             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                                   |
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+