在 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
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java 面试真题解析
面试合集:https://gitee.com/mydb/interview