重定向属性 (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。
数据传递方式
- URI 变量:自动扩展路径中的占位符。
- 查询参数:通过
addAttribute添加。 - 闪传属性 (Flash Attributes):通过
addFlashAttribute添加,不显示在 URL 中。
补充教学
1. 为什么要显式注入 RedirectAttributes?
如果你不注入它,Spring 会用默认的 Model。如果你的页面渲染逻辑往 Model 里放了大量的辅助性数据,重定向之后的 URL 可能会变成一长串无意义的垃圾字符,这不仅难看,还可能超过浏览器的 URL 长度限制。
2. redirect: 前缀的魔力
当返回字符串以 redirect: 开头时,DispatcherServlet 不会调用 ViewResolver 去渲染页面,而是发起一个 302 重定向。它会聪明地处理以下路径:
- 相对路径:相对于当前的 Servlet 上下文。
- 绝对路径:以
/开头,指向站点的根目录。
3. 注意事项:数据丢失
重定向是一个全新的 GET 请求。这意味着你存在当前请求 request 作用域里的任何东西都会丢失。如果你需要跨请求传递非简单对象(如一个 Order 详情),请使用 Flash Attributes。