闪传属性 (Flash Attributes)
闪传属性(Flash Attributes)提供了一种让一个请求存储属性以供另一个请求使用的方法。这在重定向(Post-Redirect-Get 模式)时最为常用。
工作原理
- 存储:在重定向发起前,属性被临时保存(通常是在 Session 中)。
- 获取:重定向后的目标请求可以读取这些属性。
- 销毁:属性一旦被读取,就会立即消失。
使用示例
java
@PostMapping("/save")
public String save(User user, RedirectAttributes redirectAttrs) {
// 业务操作...
redirectAttrs.addFlashAttribute("message", "保存成功!");
return "redirect:/list";
}
@GetMapping("/list")
public String list(Model model) {
// "message" 会自动从 FlashMap 中提取并放入当前的 model 中
return "userList";
}kotlin
@PostMapping("/save")
fun save(user: User, redirectAttrs: RedirectAttributes): String {
// 业务操作...
redirectAttrs.addFlashAttribute("message", "保存成功!")
return "redirect:/list"
}
@GetMapping("/list")
fun list(model: Model): String {
// "message" 会自动被放入 model
return "userList"
}核心抽象
- FlashMap:用于保存闪传属性的容器。
- FlashMapManager:负责管理、存储和检索
FlashMap实例。
补充教学
1. 为什么不用 URL 参数?
URL 参数(如 ?msg=ok)存在几个缺陷:
- 乱码风险:中文或特殊字符需要 URL 编码。
- 暴露信息:敏感通知信息直接显示在地址栏。
- 字数限制:URL 长度有限。 Flash Attributes 把数据藏在 Session 里,解决了上述所有问题。
2. 并发问题:它是怎么防止“误读”的?
如果用户同时开了两个重定向页面,重定向 A 的消息会不会跑进重定向 B 的页面里? Spring 为了减小这种风险,会对 FlashMap 进行“标记”。它会记录重定向的目标路径。当目标请求进来时,FlashMapManager 会核对路径,只有匹配的请求才能领走属于它的消息。
3. 注意隐患:Session 依赖
虽然 Flash Attributes 开发体验极佳,但由于它依赖 Session,在禁用 Cookie 或分布式集群(且未做 Session 共享)的环境下,数据会丢失。 建议:仅用于 UI 上的轻量级提示消息,不要用来传递核心业务数据。