目录
在Java中,跳转网页的方式有两种,一种是请求转发,另一种是请求重定向,而实际上,这两种方式是有着明显区别的。
1. 定义层面
请求转发是当客户端向服务器发送请求后,由服务器来进行请求的转发,转发给另一个目标地址,再将目标地址返回的结果从服务器返回给客户端。请求转发是发生在服务器程序内部的。
请求重定向是当客户端向服务器发送请求后,服务器给客户端返回响应,在返回的响应中记录了客户端要重新发起请求的目标地址,客户端收到响应后,会对目标地址重新发起一次请求,这就是请求重定向。
2. 请求方层面
请求转发是服务器端的行为,服务器代替客户端发送请求给第三方目标地址,并将结果返回给客户端。
请求重定向是客户端的行为,是客户端根据服务器返回的目标地址,重新对目标地址发起请求。
3. 数据共享层面
请求转发是服务器端实现的,在整个过程中,客户端只需要发送一次请求,接收一次响应,在这个过程中,请求的数据和响应的数据服务器都是可以接收到的,也就是共享的。
而请求重定向是客户端接收到第三方目标地址后进行的再一次请求,服务器端是无法接收到的,所以是不共享的。
4. 最终 url 层面
请求转发是服务器端向第三方目标地址进行请求,然后再将结果返回给客户端,所以对于客户端来说,请求的地址一直都是服务器端的地址。
请求重定向是服务器返回一个第三方目标地址给客户端,客户端再向这个地址发送请求,所以目标 url 是这个第三方目标地址。
5. 代码实现层面
请求转发
// 请求转发
@RequestMapping("/fw")
public Object fw(){
return "forward:/index.html";
}
// 请求转发
@RequestMapping("/fw2")
public void fw2(HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException {
request.getRequestDispatcher("/index.html").forward(request,response);
}
请求重定向
// 请求重定向 路径会发生变化 -> http://localhost:8080/index.html
@RequestMapping("/rd")
public Object rd(){
return "redirect:/index.html";
}
// 请求重定向
@RequestMapping("/rd2")
public void rd2(HttpServletResponse response) throws IOException {
response.sendRedirect("index.html");
}