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