请求转发和请求重定向是我们经常使用的两种页面跳转方式, 但是两者有着诸多区别, 例如跳转的方式, 代码的实现以及最终的 url 地址都有所不同.
1请求转发
请求转发(forward): 服务器帮客户进行请求转发并将结果响应给客户端, URL 地址是不变的, 因为是服务器端进行转发和响应的, 并且请求转发只访问一次, 两种实现方式如下:
方式一: (自行写一个简单的 html页面放在 static文件下)
@Controller // 注意这里不要写成 @RestController, 因为我们返回的是一个页面
public class DemoController {
@RequestMapping("/forward")
public String myForward() {
// 这里可以省略掉 forward, 因为页面默认的转发就是请求转发
return "forward: /hello.html";
}
}
方式二:
@Controller
public class DemoController {
@RequestMapping("/fw2")
public void myForward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/hello.html").forward(request,response);
}
}
测试:
2 请求重定向
请求重定向(redirect): 服务器端将请求重新定义到要访问的地址上, URL 地址会发生变化; 请求重定向是两次访问, 发生在客户端, 也就是浏览器端, 服务器端不用替用户进行请求操作, 两种实现方式如下:
方式一:
@Controller
public class DemoController {
@RequestMapping("/rd1")
public String myRedirect1() {
return "redirect:/hello.html";
}
}
方式二:
@Controller
public class DemoController {
@RequestMapping("/rd2")
public void myRedirect2(HttpServletResponse response) throws IOException {
response.sendRedirect("/hello.html");
}
}
测试:
3 总结
- 请求转发 URL 地址不变, 因为是服务器端进行转发和响应的; 请求重定向 URL 地址会发生改变, 因为服务器端直接将请求重定向到具体的地址上;
- 请求转发有可能发生外部资源的丢失,导致访问不到; 而请求重定向是直接重定向到 URL 地址上, 所以请求重定向和直接访问目标地址的效果是一样的, 不会存在外部资源丢失的情况;
- 请求转发是一次访问, 请求重定向是两次访问.