Spring MVC 请求方式分为转发forward 、重定 redirect向 2 种,分别使用 forward 和 redirect 关键字在 controller 层进行处理。
转发是服务器行为,重定向是客户端行为
转发过程:
客户浏览器发送 http 请求,Web 服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里转发的路径必须是同一个 Web 容器下的 URL,其不能转向到其他的 Web 路径上,中间传递的是自己的容器内的 request。
在客户浏览器的地址栏中显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
特点:
转发时,URL不会变;由原先的controller传入的参数,也会被后面所转发的controller所获取的
浏览器对于转发的话,只发起一次请求
可以用于后续浏览器中,在用户输入完账号密码后,存放在容器request中,通过转发,就不需要一次次的再次输入账号密码
@GetMapping("/testForward")
public String testForward(HttpServletRequest request) {//这边可以传参数,也可以不传
request.setAttribute("name", "ccj");
return "forward:/hello";
}
@RequestMapping(value = {"/hello"})
public String hello() {
return "hello";
}
重定向过程:
客户浏览器发送 http 请求,Web 服务器接受后发送 302 状态码响应及对应新的 location 给客户浏览器,客户浏览器发现是 302 响应,则自动再发送一个新的 http 请求,请求 URL 是新的 location 地址,服务器根据此请求寻找资源并发送给客户。
在这里 location 可以重定向到任意 URL,既然是浏览器重新发出了请求,那么就没有什么 request 传递的概念了。在客户浏览器的地址栏中显示的是其重定向的路径,客户可以观察到地址的变化。重定向行为是浏览器做了至少两次的访问请求。
特点:
重定向时,URL会发生改变,会变为后面所重定向的链接:由原先的controller传入的参数,无法被后面所重定向的controller所获取的
浏览器对于重定向的话,只发起两次次请求
@GetMapping("/testRedirect")
public String testRedirect(HttpServletRequest request) {
request.setAttribute("name", "ccj");
return "redirect:/hello";
}
@RequestMapping(value = {"/hello"})
public String hello() {
return "hello";
}