JSP转发与redirect的区别

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

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

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


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

我听说过redirect和转发的有趣的解释。 想象一下,你需要从你的朋友那里得到一些服务。它不关心什么服务。 假设你的朋友不能帮助你,但知道谁可以。

如果他会告诉你,他会重新申请你的请求:“我不能处理这个,但知道谁可以。他的电话号码,给他打电话”

如果他会告诉你:“没有问题”,并且自己打电话给他,但是没有注意到你让另一个人处理你的愿望,他就会告诉你。 那么你的朋友会得到你想要的结果,并传递给你

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

redirect:

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

前锋:

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

这篇文章使用一个很好的现实世界的例子给出了一个关于forward和redirect的很好的解释。

牛奶来了,并要求在你家每月支付给你。 这里房子是容器,你是容器中存在的资源。 牛奶人是客户或浏览器。

他要求你每月付款,这是浏览器对资源A的要求。如果你进入你的房子,并要求你的母亲(在同一个容器内的另一个资源B)拿回现金,然后送回给送牛奶这被称为前进。

如果你要求送奶员在你家里对自己的母亲说自己的话,或者你要求送奶员和他在办公室的父亲(不同的领域)说话,那么这叫做redirect。

当您转发请求时,

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

当您将请求redirect到另一个JSP / servlet时,

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