重定向属性
默认情况下,所有模型属性都被视为在重定向URL中作为URI模板变量进行暴露。在剩余的属性中,那些是基本类型(primitive types)或者基本类型的集合/数组(collections or arrays of primitive types)的属性会自动作为查询参数(query parameters)附加到URL中。
如果模型实例是专门为重定向准备的,那么将基本类型属性作为查询参数附加是可以实现预期效果的。然而,在带有注解的控制器中,模型可能还包含为了渲染目的而添加的其他属性(例如,下拉字段的值)。为了避免这些属性出现在URL中,@RequestMapping方法可以声明一个类型为RedirectAttributes的参数,并使用它来指定要提供给RedirectView的准确属性。如果该方法确实执行了重定向,那么将使用RedirectAttributes的内容;否则,将使用模型中的内容。
RequestMappingHandlerAdapter 提供了一个名为 ignoreDefaultModelOnRedirect 的标志,您可以使用该标志来指示如果控制器方法进行重定向,则永远不应使用默认的 Model 中的内容。相反,控制器方法应该声明一个类型为 RedirectAttributes 的属性;如果没有这样做,则不应将任何属性传递给 RedirectView。为了保持向后兼容性,MVC 命名空间和 MVC Java 配置都将此标志设置为 false。但是,对于新的应用程序,我们建议将其设置为 true。
请注意,在扩展重定向URL时,当前请求中的URI模板变量会自动被使用,因此你不需要通过Model或RedirectAttributes显式地添加它们。以下示例展示了如何定义一个重定向:
- Java
- Kotlin
@PostMapping("/files/{path}")
public String upload(...) {
// ...
return "redirect:files/{path}";
}
@PostMapping("/files/{path}")
fun upload(...): String {
// ...
return "redirect:files/{path}"
}
另一种将数据传递给重定向目标的方法是使用flash属性。与其他重定向属性不同,flash属性会保存在HTTP会话中(因此不会出现在URL中)。有关更多信息,请参阅Flash属性。