Redirect Attributes

默认情况下,所有模型属性都被视为在重定向 URL 中作为 URI 模板变量公开。在剩余的属性中,基本类型或基本类型的集合或数组会自动作为查询参数附加。

如果模型实例专门为重定向而准备,那么将基本类型属性作为查询参数附加可能是期望的结果。但是,在带注释的控制器中,模型可以包含为渲染目的添加的其他属性(例如,下拉字段值)。为了避免出现此类属性在 URL 中的情况,@RequestMapping 方法可以声明 RedirectAttributes 类型的参数并使用它来指定要提供给 RedirectView 的确切属性。如果方法确实重定向,则将使用 RedirectAttributes 的内容。否则,将使用模型的内容。

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

请注意当展开重定向 URL 时,当前请求的 URI 模板变量会自动变为可用,不需要通过 ModelRedirectAttributes 显式添加它们。以下示例演示如何定义重定向:

  • 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