jsp:forward
请解释和之间的区别redirect
。
在每种情况下发生了什么?
7 回答
redirect 将响应状态设置为 302 [1],并在
Location
header 中设置新的 url,并将响应发送到浏览器。然后浏览器根据http规范,再次请求新的url转发完全发生在服务器上。servlet 容器只是将相同的请求转发到目标 url,而浏览器并不知道这一点。因此,您可以在处理新 url 时使用相同的请求属性和相同的请求参数。并且浏览器不会知道 url 已经改变(因为它完全发生在服务器上)
[1]:这是一个行业实践与标准相矛盾的例子。HTTP/1.0 规范 (RFC 1945) 要求客户端执行临时重定向(最初的描述短语是“临时移动”),但流行的浏览器使用 303 See Other 的功能实现了 302。因此,HTTP/1.1 增加了状态码 303 和 307 来区分这两种行为。但是,一些 Web 应用程序和框架使用 302 状态代码,就好像它是 303。来源
我听说过重定向和转发的有趣解释。想象一下,您需要朋友提供一些服务。什么服务都无所谓。假设您的朋友无法帮助您,但知道谁能帮助您。
如果他告诉你,他会转接你的请求:“我不能处理这个,但我知道谁能处理。这是他的电话号码。给他打电话。”
如果他告诉你:“没问题”,他会转发你的请求,并自己打电话给那个人,而不通知你让另一个人参与处理你的欲望。然后,您的朋友会得到整理您的愿望的结果并将其传送给您。
与转发相比,重定向也更慢,因为它必须通过浏览器并等待浏览器发出新请求,因此也会导致请求范围对象在重定向后不可用。
重定向:
- 用户请求资源。
- 响应发送给用户。
- 这不是请求的资源,这是 HTTP 代码 302 的响应,包含请求资源的 URL。
- URL 可以与请求的 URL 相同或不同。
- 客户端浏览器使用新 URL 再次请求资源,这一次将实际资源发送给用户。
向前:
它是简单地向用户显示请求的资源的过程。它完全发生在服务器端。
这篇文章使用一个很好的真实示例对转发与重定向进行了很好的解释。
送牛奶的人来了,要求你在家里按月付款。这里的房子是容器,而你是容器中存在的资源。牛奶人是客户端或浏览器。
他要求每月支付给你,这是浏览器对资源 A 的请求。如果你走进你的房子,向你的母亲(同一个容器内的另一个资源 B)要现金,然后回来并送到送奶工这称为向前。
如果您要求送奶人在您家中与您的母亲交谈,或者您要求送奶人与您在办公室(不同域)中的父亲交谈,则这称为重定向。
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
| 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 |
+-------------------------------------------------------------------------+-----------------------------------------------------------------------------+
当您转发请求时,
- 请求和响应对象被转移。-url 保持不变。
当您将请求重定向到另一个 JSP/servlet 时,
- 请求和响应对象不会转移到新对象。-Url 更改为新页面的目录。