Skip to content

重定向属性 (Redirect Attributes)

默认情况下,所有的模型属性都会被视为重定向 URL 中的 URI 模板变量。其余的属性中,如果是简单类型(或简单类型的集合/数组),则会自动附加为查询参数(Query Parameters)。

使用 RedirectAttributes

虽然重定向可以自动带参数,但通常你不希望所有的模型数据(如用于下拉列表的数据)都出现在 URL 中。 你可以声明一个 RedirectAttributes 类型的参数,来精确指定哪些属性要传递给重定向目标。

java
@PostMapping("/files/{path}")
public String upload(@PathVariable String path, RedirectAttributes redirectAttrs) {
	// ... 业务逻辑 ...
	redirectAttrs.addAttribute("status", "success");
	return "redirect:/files/{path}"; // {path} 会自动从 URI 变量中获取
}
kotlin
@PostMapping("/files/{path}")
fun upload(@PathVariable path: String, redirectAttrs: RedirectAttributes): String {
	// ... 业务逻辑 ...
	redirectAttrs.addAttribute("status", "success")
	return "redirect:/files/{path}"
}

忽略默认模型

RequestMappingHandlerAdapter 中有一个标志位 ignoreDefaultModelOnRedirect

  • 默认值false(为了向后兼容)。
  • 建议设置true。这样除非你显式使用 RedirectAttributes,否则模型里的东西不会被自动塞进 URL。

数据传递方式

  1. URI 变量:自动扩展路径中的占位符。
  2. 查询参数:通过 addAttribute 添加。
  3. 闪传属性 (Flash Attributes):通过 addFlashAttribute 添加,不显示在 URL 中。

补充教学

1. 为什么要显式注入 RedirectAttributes?

如果你不注入它,Spring 会用默认的 Model。如果你的页面渲染逻辑往 Model 里放了大量的辅助性数据,重定向之后的 URL 可能会变成一长串无意义的垃圾字符,这不仅难看,还可能超过浏览器的 URL 长度限制。

2. redirect: 前缀的魔力

当返回字符串以 redirect: 开头时,DispatcherServlet 不会调用 ViewResolver 去渲染页面,而是发起一个 302 重定向。它会聪明地处理以下路径:

  • 相对路径:相对于当前的 Servlet 上下文。
  • 绝对路径:以 / 开头,指向站点的根目录。

3. 注意事项:数据丢失

重定向是一个全新的 GET 请求。这意味着你存在当前请求 request 作用域里的任何东西都会丢失。如果你需要跨请求传递非简单对象(如一个 Order 详情),请使用 Flash Attributes

Based on Spring Framework.