forward(转发) 与 redirect(重定向) 是 servlet 提供的两种跳转方式。这两种跳转方式的具体区别如下表所述:
forward | redirect | |
---|---|---|
地址栏 | forword是服务器内部的重定向,即服务器直接访问目标地址的 url,并把其中的内容作为响应结果返回给浏览器,所以浏览器的地址栏不会发生变化。 | 服务器发送给浏览器一个 302 状态码,让其请求新的地址,所以地址栏中的地址会显示为新的地址。 |
共享数据 | 由于在服务器内部重定向的过程中,用的是同一个request,因此这个 request 可以带给其它 servlet 中供其使用,即共享数据。 | 不能 |
应用场景 | 一般用于用户登录时,根据角色权限跳转到相应模块 | 一般用于用户注销登录时,返回主页面或跳转到其他网站 |
效率 | 高 | 低 |
本质 | 服务器行为 | 客户端行为 |
请求次数 | 1次 | 2次。比如客户端请求 A 地址,服务端让其重定向到 B 地址,客户端请求 B 地址。 |
重定向在 Controller 的方法中,返回值加入 redirect:
前缀,参见下面的这个示例:
@GetMapping("/toShow")
public String toShow(Model model) {
return "redirect:/product/show";
}
在浏览器的调试模式下,可以看到重定向实际有两次请求:
服务端通过返回状态码 302,告知客户端需要重定向。