spring mvc 中 flashattributes 通过 flash map 机制在重定向时安全传递一次性参数,将数据临时存入 session 并仅对下一次请求有效,随后自动清理。

Spring MVC 中通过 FlashAttributes 在重定向时安全传递一次性参数,核心是利用 Spring 的 Flash Map 机制 —— 它将数据临时存入 session(但仅对下一次请求有效),并在重定向后自动清理,避免手动管理 session 生命周期或 URL 拼接敏感信息。
理解 FlashAttributes 的作用时机
FlashAttributes 不是普通 request attribute,也不是长期 session attribute。它专为“重定向前设置、重定向后立即读取、读完即销毁”设计。Spring 在 redirect 发起时把 FlashAttributes 序列化到 session 中一个名为 FLASH_MAPS 的特殊属性里,并在目标控制器方法执行前自动还原为 model attribute,同时清空该次 flash 数据。
- 必须在返回
"redirect:/xxx"前调用addFlashAttribute() - 目标 handler 方法的
Model或@ModelAttribute参数会自动包含这些值 - 若目标页面未访问该属性,下次请求仍不会残留(Spring 自动清理)
正确使用 addFlashAttribute() 方法
推荐在 controller 方法中通过 RedirectAttributes 参数添加,而非直接操作 session。这是最安全、最符合约定的方式:
- 使用
redirectAttrs.addFlashAttribute("key", value)添加对象(支持任意序列化类型) - 避免用
addAttribute()—— 它只拼在 URL 后,不安全且有长度/编码限制 - 若需传递简单字符串且不想进 session,可配合
RedirectView手动设 model,但不推荐用于敏感或复杂对象
示例:
@PostMapping("/login")
public String login(User user, RedirectAttributes redirectAttrs) {
if (authService.login(user)) {
redirectAttrs.addFlashAttribute("message", "登录成功");
return "redirect:/dashboard";
} else {
redirectAttrs.addFlashAttribute("error", "用户名或密码错误");
return "redirect:/login";
}
}
在目标 Controller 中接收 Flash 属性
无需额外配置,Spring 会自动把 FlashAttributes 注入到目标方法的 Model 或对应形参中:
- 直接在目标方法参数中声明同名对象(如
@ModelAttribute("message") String msg) - 或通过
Model model调用model.getAttribute("message") - Thymeleaf 模板中可直接用
${message}渲染(前提是已加入 model) - 注意:FlashAttributes 不会出现在后续请求中,刷新页面后即消失
注意事项与常见陷阱
FlashAttributes 依赖 session,默认基于 HttpSession 实现。因此需确保:
- 应用启用了 session(Servlet 容器默认开启,但某些无状态部署可能禁用)
- 用户浏览器未禁用 cookie(或服务端配置了 URL 重写 fallback)
- 不要在异步请求(如 AJAX redirect)中依赖 Flash —— 浏览器不会自动携带 session cookie 到新请求上下文
- 避免传递大对象(如文件流、数据库连接),因需序列化到 session,影响性能和内存
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











