在Java中进行页面跳转的方式有两种:重定向和请求转发,但是两者的内部实现是完全不一样的,主要区别分为以下5种:
- 定义不同
- 请求方式不同
- 数据共享不同
- 最终 URL 地址不同
- 代码实现不同
1,定义不同
请求重定向(forward)
请求重定向指的是客户端(浏览器)向服务器发送一个请求时,服务器会给客户端返回一个临时响应头,响应头里面记录着客户端需要再次发起请求的URL地址,此时客户端会再次将请求发送给这个新的地址上,这个就叫做请求重定向!例如:小明(客户端)找妈妈(服务器1)要一个礼物,妈妈给了小明钱(响应头中的URL)让小明自己去超市(服务器2)买。
请求转发(redirect)
请求转发指的是客户端(浏览器)向服务器发送一个请求时,服务器会自动帮客户端将请求转发到目标地址,再将目标地址的响应结果返回给客户端,这一整个过程都是发生在服务器的内部;作为客户端不需要关心服务器内部具体执行过程,只需要接收响应即可!例如:小明(客户端)找妈妈(服务器)要一个礼物,妈妈去超市(目标地址)给小明买了一个礼物给了小明。
2,请求方式不同
请求重定向(forward)
请求重定向是客户端的行为,客户端需要访问两次服务器(这两次的服务器不是同一个服务器),访问详情如下:
请求转发(redirect)
请求转发是服务器的行为,客户端不关心服务器如何工作,只需要接收响应即可,访问详情如下:
3,数据共享不同
请求重定向(forward)
请求重定向是服务器内部实现的,自动帮客户端定位到新的目标地址,在整个交互过程中使用的都是同一份Request请求对象和同一份Response响应对象,所以整个请求过程中,数据都是共享的。
请求转发(redirect)
请求转发客户端需要访问两次不同的服务器,发送了两次请求,每次发送请求给指定服务器的时候都是使用的是不同的Request请求对象和Response响应对象,所以整个请求过程中,数据是不共享的。
4,最终URL地址不同
请求重定向(forward)
请求重定向服务器自动帮助客户端发送请求给新的目标服务器,客户端只需要接收响应结果即可,所以整个访问过程中的URL地址都是不会发生变化的。
请求转发(redirect)
请求转发客户端发送了两次请求,所以第二次访问新的目标地址的时候,相对于第一次的URL地址是不同的。
5,代码实现不同
请求重定向(forward)
@RequestMapping("/rt")
public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.sendRedirect("/index.html");
}
请求转发(redirect)
@RequestMapping("/fw")
public void forward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/index.html").forward(request, response);
}
请求转发和请求重定向的核心区别就是,请求转发需要访问两次服务器(即需要发送两次请求),而请求重定向客户端只需要发送一次请求,服务器内部会帮我们自动跳转到目标服务器,客户端不需要关心执行过程!