默认情况下,所有模型属性都被认为是作为 URI 模板变量暴露在重定向 URL 中。在其余的属性中,那些原始类型或原始类型的集合或数组被自动附加为查询参数。

    如果模型实例是专门为重定向准备的,那么将原始类型的属性附加为查询参数可能是理想的结果。然而,在有注解的控制器中,模型可以包含为渲染目的而添加的额外属性(例如,下拉(drop-down)字段值)。为了避免这种属性出现在 URL 中的可能性,@RequestMapping 方法可以声明一个 RedirectAttributes 类型的参数,并使用它来指定确切的属性来提供给 RedirectView。如果该方法做了重定向,RedirectAttributes 的内容就被使用。否则,将使用模型的内容。

    RequestMappingHandlerAdapter 提供了一个名为 ignoreDefaultModelOnRedirect 的标志,你可以用它来表示,如果一个控制器方法重定向,就不应该使用默认模型的内容。相反,控制器方法应该声明一个 RedirectAttributes 类型的属性,或者,如果它不这样做,就不应该有任何属性被传递给 RedirectView。MVC 命名空间和 MVC Java 配置都将这个标志设置为 false,以保持向后兼容。然而,对于新的应用程序,我们建议将其设置为true。

    注意,在扩展重定向 URL 时,来自当前请求的 URI 模板变量会自动提供,你不需要通过 Model 或 RedirectAttributes 明确地添加它们。下面的例子显示了如何定义一个重定向:

    1. @PostMapping("/files/{path}")
    2. public String upload(...) {
    3. // ...
    4. return "redirect:files/{path}";
    5. }

    另一种向重定向目标传递数据的方式是使用 flash 属性。与其他重定向属性不同,flash 属性被保存在 HTTP 会话中(因此不会出现在 URL 中)。更多信息请参见 Flash 属性

    比如下面这个例子

    1. @GetMapping("/files")
    2. public String upload1(RedirectAttributes redirectAttributes) {
    3. redirectAttributes.addAttribute("path", "xxxooo")
    4. .addAttribute("par", "张三");
    5. return "redirect:/files/{path}";
    6. }
    7. @GetMapping("/files/{path}")
    8. @ResponseBody
    9. public String upload2(
    10. @PathVariable String path,
    11. @RequestParam Map<String, String> params) {
    12. // ...
    13. return "success";
    14. }

    访问 [http://localhost:8080/files](http://localhost:8080/files/xxxooo?par=%3F%3F) 会被 302 重定向到 [http://localhost:8080/files/xxxooo?par=%3F%3F](http://localhost:8080/files/xxxooo?par=%3F%3F) 地址