4

面试突击:请求转发和请求重定向有什么区别?你懂了吗?

 1 year ago
source link: https://developer.51cto.com/article/714188.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

面试突击:请求转发和请求重定向有什么区别?你懂了吗?-51CTO.COM

面试突击:请求转发和请求重定向有什么区别?你懂了吗?
作者:磊哥 2022-07-18 07:11:35
请求转发和请求重定向遵循的是“字越少,事越大”的原则,“请求转发”的字比较少,它需要代客户端执行跳转;而“请求重定向”字比较多,它啥也不干,只是告诉客户端“你去别的地儿访问”就行了,这就是理解这两个概念的关键。它们的区别主要体现在 5 个点:定义不同、请求方不同、数据共享不同、最终 URL 地址不同、代码实现不同。

在 Java 中,跳转的实现方式有两种:请求转发和请求重定向,但二者是完全不同的,所以我们今天就来盘它。请求转发和请求重定向主要区别,包含以下 5 点:

  • 跳转方不同
  • 数据共享不同
  • 最终 URL 地址不同
  • 代码实现不同

接下来,我们一个一个来看。

1.定义不同

请求转发(Forward):发生在服务端程序内部,当服务器端收到一个客户端的请求之后,会先将请求,转发给目标地址,再将目标地址返回的结果转发给客户端。而客户端对于这一切毫无感知的,这就好比,张三(客户端)找李四(服务器端)借钱,而李四没钱,于是李四又去王五那借钱,并把钱借给了张三,整个过程中张三只借了一次款,剩下的事情都是李四完成的,这就是请求转发。请求重定向(Redirect):请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回了一个临时响应头,这个临时响应头中记录了,客户端需要再次发送请求(重定向)的 URL 地址,客户端再收到了地址之后,会将请求发送到新的地址上,这就是请求重定向。这就好像张三(客户端)找李四(服务器端)借钱,李四没钱,于是李四就告诉张三,“我没钱,你去王五那借“,于是张三又去王五家借到了钱,这就是请求重定向。

2.请求方不同

从上面请求转发和请求重定向的定义,我们可以看出:请求转发是服务器端的行为,服务器端代替客户端发送请求,并将结果返回给客户端;而请求重定向是客户端的行为,它们的交互流程,如下图所示:

图片

3.数据共享不同

请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。

4.最终 URL 地址不同

请求转发是服务器端代为请求,再将结果返回给客户端的,所以整个请求的过程中 URL 地址是不变的;而请求重定向是服务器端告诉客户端,“你去另一个地访问去”,所以浏览器会重新再发送一次请求,因此客户端最终显示的 URL 也为最终跳转的地址,而非刚开始请求的地址,所以 URL 地址发生了改变。

5.代码实现不同

在 SpringBoot 中,请求转发的实现代码如下:

@RequestMapping("/fw")
public void forward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/index.html").forward(request, response);
}

而请求重定向的实现代码如下:

@RequestMapping("/rt")
public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.sendRedirect("/index.html");
}

请求转发和请求重定向遵循的是“字越少,事越大”的原则,“请求转发”的字比较少,它需要代客户端执行跳转;而“请求重定向”字比较多,它啥也不干,只是告诉客户端“你去别的地儿访问”就行了,这就是理解这两个概念的关键。它们的区别主要体现在 5 个点:定义不同、请求方不同、数据共享不同、最终 URL 地址不同、代码实现不同。

参考 & 鸣谢

www.jianshu.com/p/81407dff803d

www.cnblogs.com/su-chu-zhi-151/p/11875641.html​


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK