一、概念
springMVC请求方式分为重定向、转发,分别用redirect、forward关键字在controller层进行处理。
重定向是将用户从当前处理请求定向到另一个视图(例如JSP)或者请求,以前的请求中存放的请求request全部失效,并进入一个新的request作用域;
转发是将用户对当前处理的请求转发给另一个视图或者请求,以前的request中存放的请求不会失效。
转发是服务器行为,重定向是客户端行为。
1.1、转发过程
客户端浏览器发送http请求,web服务器接收此请求,调用内部的一个方法在容器内完成请求处理和转发动作,将目标资源发送给客户。这里的转发路径必须是同一个web容器下的URL,不能转向到其他的web路径上,中间传递的是自己容器的request。
在客户端浏览器地址栏上显示的任然是第一次访问的路径,也就是说客户端感觉不到服务器做了转发,转发行为浏览器只做了一次请求。
1.2、重定向过程
客户端浏览器发送http请求,web服务器接收后发送302状态码及新的location给客户端浏览器,客户端浏览器发现是302响应,则自动再发送一个新的http请求,请求URL是新的location地址,服务器据此查找资源并返回给浏览器。
在这里location可以重定向到任意url,既然是浏览器重新发出的请求,以前的request就不存在了。在客户端浏览器地址栏显示的是重定向路径,用户可以观察到地址栏地址的变化,重定向行为是客户端浏览器至少做了两次访问请求。
在springMVC中,控制器类中处理方法的return语句默认实现的转发,只不过实现的是转发到视图。
@RequestMapping("/register")
public String register(){
return "register";
}
二、示例
@Controller
@RequestMapping("/index")
public class IndexController {
@RequestMapping("/login")
public String login(){
//转发到一个请求
return "forward:/index/isLogin";
}
@RequestMapping("/isLogin")
public String isLogin(){
//重定向到一个请求方法
return "redirect:/index/isRegister";
}
@RequestMapping("/isRegister")
public String isRegister(){
//转发到一个视图
return "register";
}
}
在springMVC中,不管是重定向还是转发,都需要复合视图解析器配置,如果直接转发到一个不需要DispatcherServlet的资源,需要使用mvc:resources配置
return "forward:/html/my.html";
<mvc:resources location="/html/" mapping="/html/**" />