Java中转发和重定向再温习

本文详细介绍了Java中请求转发和请求重定向的区别与实现。请求转发是服务端内部操作,URL不变,而请求重定向是客户端发起新请求,URL会改变。SpringBoot中,请求转发可通过`request.getRequestDispatcher().forward()`实现,重定向使用`response.sendRedirect()`完成。

在java中,跳转的实现方式有两种:请求转发和请求重定向,下面对其进行温故,看看能否知新。
在这里插入图片描述
在这里插入图片描述

1、定义

  • 请求转发:forward,发生在服务端程序内部,当服务端收到一个客户端的请求之后,会先将请求转发给目标地址,再将目标地址返回的结果转发给客户端。
    如:张三(客户端)找李四(服务端)借钱,而李四没钱,于是李四又去找王五借钱,并把借来的钱借给了张三。整个过程张三只借了一次钱,剩下的事情都是李四完成的,这就是请求转发。
  • 请求重定向:redirect,当服务端收到客户端的请求之后,会给客户端返回一个临时响应头,这个临时响应头中记录了客户端需要再次发送请求的url地址,客户端收到地址之后,会将请求发送到新的地址上。
    如:张三(客户端)找李四(服务端)借钱,而李四没钱,于是李四就告诉张三,我没钱,你去王五那借钱,于是张三又去王五那借钱,这就是请求重定向。

2、请求方式

  • 请求转发:是服务端的行为,服务端代替客户端发送请求,并将结果返回给客户端;
  • 请求重定向:是客户端的行为;

3、请求和响应

  • 请求转发:请求转发是服务端实现的,所以整个执行流程,客户端只需发送一次请求,因此整个只需流程使用的是同一个request和response;
  • 请求重定向:请求重定向是客户端发送两次完全不同的请求,所以两次请求中使用的request和response是不同的;

4、最终URL地址

  • 请求转发:是服务端代为请求,再将结果返回给客户端,所以请求的过程中URL地址是不变的;
  • 请求重定向:是服务端告诉客户端,再次请求的地址,所以浏览器会重新再发送一次请求,因此客户端最终显示的URL也是最终跳转的地址;

5、代码实现
在springboot中的代码实现

  • 请求转发:
@RequestMapping("/forward")
public void forward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/index.html").forward(request, response);
}
  • 请求重定向:
@RequestMapping("/redirect")
public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.sendRedirect("/index.html");
}
Java Web开发中,请求转发重定向是两种常用的页面跳转技术。 ### 原理 - **请求转发(Forward)**:是服务器内部的操作,当服务器接收到客户端的请求后,服务器会将该请求转发到另一个资源(如JSP页面、Servlet等)进行处理,整个过程是在服务器端完成的,客户端并不知道服务器进行了转发操作,它只发送了一次请求,也只接收一次响应 [^2]。 - **重定向(Redirect)**:是在客户端发生的。当服务器接收到客户端的请求后,会返回一个状态码(通常是302)一个新的URL给客户端。客户端浏览器接收到这个响应后,会根据新的URL再次发送一个新的请求到指定的URL,从而完成页面的跳转 [^4]。 ### 区别 - **请求响应次数**:转发是一次请求一次响应;重定向是两次请求两次响应 [^3]。 - **数据传递**:转发时request的数据不会丢失,因为是在同一个请求中进行处理;重定向时request的数据会丢失,因为是两次不同的请求 [^3]。 - **地址栏显示**:转发时地址栏显示的是最初请求的页面;重定向时地址栏显示最终请求的页面 [^3]。 ### 使用方法 - **请求转发**:使用`request.getRequestDispatcher("/地址").forward(request, response);`方法实现。示例代码如下: ```java import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class ForwardServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 转发到另一个资源 RequestDispatcher dispatcher = request.getRequestDispatcher("/targetURL"); dispatcher.forward(request, response); } } ``` - **重定向**:使用`HttpServletResponse`的`sendRedirect()`方法实现。示例代码如下: ```java import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class RedirectServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 重定向到另一个URL response.sendRedirect("/targetURL"); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值