Spring MVC 是对 Servlet 的进一步封装,其本质就是一个 Servlet,因此在 Spring MVC 中也存在转发和重定向的概念。

在 Spring MVC 中,我们可以在逻辑视图名中通过“forward:”和“redirect:”两个关键字来表示转发和重定向。

请求转发

我们可以在控制器方法指定逻辑视图名(View Name)时,使用“forward:”关键字进行请求转发操作。

当控制器方法中所设置的逻辑视图名称以“forward:”为前缀时,该逻辑视图名称不会被 Spring MVC 配置的视图解析器解析,而是会将前缀“forward:”去掉,以剩余部分作为最终路径通过转发的方式实现跳转。
1.通过 String 类型的返回值实现转发
我们可以通过控制方法返回的 String 字符串类型的返回值实现请求转发。

@RequestMapping("/testDispatcher")
public String testDispatcher() {
    return "forward:/login";
}

在上面的代码中,控制器方法返回的是一个字符串类型的值“forward:/login”,此时 Spring MVC 会将“forward:”识别为转发指示符,而剩余的“/login”则会被当做转发的 URL,即路径“/testDispatcher”请求最终会被转发到 “/login”上进行处理。
2. 通过 ModelAndView 实现转发
我们还可以通过 ModelAndView 实现请求转发

/**
 * 通过 ModeAndView 实现转发
 * @return
 */
@RequestMapping("/testForward2")
public ModelAndView testForward2() {
    ModelAndView modelAndView = new ModelAndView();
    //设置逻辑视图名
    modelAndView.setViewName("forward:/user");
    //在request域对象中添加信息
    modelAndView.addObject("requestScope", "ModelAndView:转发!");
    return modelAndView;
}

重定向

我们可以在控制器方法指定逻辑视图名(View Name)时,使用“redirect:”关键字进行重定向操作。

当控制器方法中所设置的视图名称以“redirect:”为前缀时,该视图名称不会被 Spring MVC 配置的视图解析器解析,而是会将前缀“redirect:”去掉,以剩余部分作为最终路径通过重定向的方式实现跳转。

在 Spring MVC 中,实现重定向的最常用的方式两种:
1.通过 String 类型的返回值实现重定向
我们可以通过控制器方法返回的字符串类型的返回值实现重定向,示例代码如下。

@RequestMapping("/testRedirect")
public String testRedirect() {
    return "redirect:/login";
}

2.通过 ModelAndView 实现重定向
我们还可以通过 ModelAndView 实现请求转发,示例代码如下。

@RequestMapping("/testRedirect")
public ModelAndView testDispatcher() {
    ModelAndView modelAndView = new ModelAndView();
    //设置逻辑视图名
    modelAndView.setViewName("redirect:/login");
    return modelAndView;
}
```

# [学习原文](http://c.biancheng.net/spring_mvc/9674.html)