请解释jsp:forward
和redirect
之间的区别。
在每种情况下发生了什么?
答案 0 :(得分:135)
重定向将响应状态设置为302 [1],将新网址设置为Location
标头,并将响应发送到浏览器。然后,根据http规范,浏览器向新URL发送另一个请求
转发完全发生在服务器上。 servlet容器只是将相同的请求转发到目标URL,而浏览器不知道这一点。因此,在处理新URL时,您可以使用相同的请求属性和相同的请求参数。并且浏览器不会知道网址已经更改(因为它完全发生在服务器上)
[1]:这是与标准相矛盾的行业惯例。 HTTP / 1.0规范(RFC 1945)要求客户端执行 临时重定向(原始描述短语是“已移动” 暂时“),但流行的浏览器实现302与 303的功能见其他。因此,HTTP / 1.1添加状态 代码303和307来区分这两种行为。然而, 一些Web应用程序和框架使用302状态代码,就像它一样 是303. Source
答案 1 :(得分:33)
我听说过重定向和前进的有趣解释。想象一下,你需要你朋友的一些服务。什么服务并不重要。假设你的朋友无法帮助你,但知道谁可以。
如果他告诉你,他会改变你的要求:“我无法解决这个问题,但我知道谁可以。这是他的电话号码。打电话给他。”
如果他告诉你:“没问题”,他会提出你的请求,并且在没有通知你涉及另一个人处理你的愿望的情况下自己打电话给那个人。然后,您的朋友将获得整理您的愿望的结果并将其传送给您。
答案 2 :(得分:11)
与转发相比,重定向速度也较慢,因为它必须通过浏览器并等待浏览器发出新请求,因此导致请求范围对象在重定向后不可用。
答案 3 :(得分:6)
重定向:
正向:
这是向用户简单显示所请求资源的过程。它完全发生在服务器端。
答案 4 :(得分:3)
This post使用一个很好的真实世界的例子给出了关于前向与重定向的非常好的解释。
牛奶男子来,并要求你在家里每月付款。 这里的房子是容器,你是一个存在的资源 容器。 Milk man是客户端或浏览器。
他要求您每月付款,这是由我们提出的 浏览器到资源A.如果你进入你的房子并问你的 现金和母亲(同一容器内的另一个资源B) 回来给送奶工这个叫做前锋。
如果你让送奶工在你的妈妈里面对你的母亲说话 或者你要求送奶工跟你父亲说话 办公室(不同的域)然后这称为重定向。
答案 5 :(得分: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 |
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
答案 6 :(得分:0)
转发请求时,
- 请求和响应对象被转移。 -url保持不变。
将请求重定向到另一个JSP / servlet时,
- 请求和响应对象不会传输到新对象。 -Url更改为新页面的目录。