默认情况下,所有模型属性都被认为是作为 URI 模板变量暴露在重定向 URL 中。在其余的属性中,那些原始类型或原始类型的集合或数组被自动附加为查询参数。
如果模型实例是专门为重定向准备的,那么将原始类型的属性附加为查询参数可能是理想的结果。然而,在有注解的控制器中,模型可以包含为渲染目的而添加的额外属性(例如,下拉(drop-down)字段值)。为了避免这种属性出现在 URL 中的可能性,@RequestMapping 方法可以声明一个 RedirectAttributes 类型的参数,并使用它来指定确切的属性来提供给 RedirectView。如果该方法做了重定向,RedirectAttributes 的内容就被使用。否则,将使用模型的内容。
RequestMappingHandlerAdapter 提供了一个名为 ignoreDefaultModelOnRedirect 的标志,你可以用它来表示,如果一个控制器方法重定向,就不应该使用默认模型的内容。相反,控制器方法应该声明一个 RedirectAttributes 类型的属性,或者,如果它不这样做,就不应该有任何属性被传递给 RedirectView。MVC 命名空间和 MVC Java 配置都将这个标志设置为 false,以保持向后兼容。然而,对于新的应用程序,我们建议将其设置为true。
注意,在扩展重定向 URL 时,来自当前请求的 URI 模板变量会自动提供,你不需要通过 Model 或 RedirectAttributes 明确地添加它们。下面的例子显示了如何定义一个重定向:
@PostMapping("/files/{path}")
public String upload(...) {
// ...
return "redirect:files/{path}";
}
另一种向重定向目标传递数据的方式是使用 flash 属性。与其他重定向属性不同,flash 属性被保存在 HTTP 会话中(因此不会出现在 URL 中)。更多信息请参见 Flash 属性。
比如下面这个例子
@GetMapping("/files")
public String upload1(RedirectAttributes redirectAttributes) {
redirectAttributes.addAttribute("path", "xxxooo")
.addAttribute("par", "张三");
return "redirect:/files/{path}";
}
@GetMapping("/files/{path}")
@ResponseBody
public String upload2(
@PathVariable String path,
@RequestParam Map<String, String> params) {
// ...
return "success";
}
访问 [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)
地址