Spring MVC 转发和重定向
重定向是将用户从当前处理请求定向到另一个视图(jsp)或处理请求,以前的请求(request)中存放的信息全部失效,并且进入一个新的request作用域;转发是将用户对当前处理的请求转发给另一个视图或处理请求,以前request域中存放的信息不会失效。
转发是服务器行为,重定向是客户端行为。
转发过程:客户端浏览器发送http请求,web服务器接收此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里转发的路径必须是同一web容器下的URL,不能转向到其他web路径上中间传递的是自己的容器内的request。在客户浏览器地址栏中显示的任然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的,转发行为是浏览器只做了一次访问请求。
重定向过程:客户端发送http请求,web服务器接收请求后发送302状态码相应及对应新的location给客户浏览器,客户浏览器发现是302相应,则自动在发送一个新的http请求请求URL新的location地址服务器根据此请求寻找新的资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发送出来的请求,那么久没有什么request传递的概念了。在客户浏览器地址栏中显示的是其重定向的路径,客户可以观察到地址栏的变化。重定向行为是浏览器做了至少两次的访问请求。
在Spring MVC框架中,控制器类中处理方法的return语句默认就是转发实现只不过实现的是转发到视图。
@RequestMapping
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value="/index")
public class IndexController {
@RequestMapping(value="/login")
public String login() {
//转发到一个请求方法(同一个控制器类中可以省略/index/)
return "forward:/index/isLogin";
}
@RequestMapping
public String isLogin() {
//重定向到一个请求方法
return "redirect:/index/isRegister";
}
@RequestMapping(value="/isRegister")
public String isRegister() {
//默认转发到一个视图
return "register";
}
}
在Spring MVC框架中,不管是转发或重定向,都需要符合视图解析器的配置,如果直接转发到一个不需要DispatcherServlet的资源,例如:
return "forward:/html/my.html";
则需要使用mvc:resources配置:
<mvc:resources location="/html/" mapping="/html/**"></mvc:resources>