flashattributes是spring mvc专为重定向设计的一次性参数传递机制,基于session临时存储,仅在下一次请求中有效并自动清空,用于安全传递提示信息或简单对象,避免url暴露和重复提交。

在 Spring MVC 中,FlashAttributes 是专为重定向(redirect)场景设计的安全参数传递机制,它利用 HTTP 会话临时存储数据,确保参数只在下一次请求中有效,避免 URL 暴露敏感信息或重复提交问题。
什么是 FlashAttributes?
FlashAttributes 是 Spring 提供的一种“一次性”请求属性容器,底层基于 session 实现,但生命周期严格限定为:当前请求设置 → 重定向触发 → 下一个请求(即目标 GET 请求)中自动暴露并清空。它不是普通 Model,也不能在当前请求的视图中直接使用(除非显式添加到 Model),主要配合 redirect: 前缀使用。
正确使用 addFlashAttribute()
必须在返回重定向视图名前,通过 RedirectAttributes 参数调用 addFlashAttribute() 方法。Spring 会自动将这些属性写入 flash scope,并在跳转后的目标控制器方法中通过 @ModelAttribute 或直接声明同名参数接收。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确示例:
```java
@PostMapping("/login")
public String handleLogin(User user, RedirectAttributes redirectAttrs) {
redirectAttrs.addFlashAttribute("message", "登录成功!");
redirectAttrs.addFlashAttribute("user", user); // 对象需可序列化
return "redirect:/home";
}
@GetMapping("/home")
public String home(Model model) {
// message 和 user 已自动添加到 model,可直接在 thymeleaf 中使用
return "home";
}
```
- ❌ 错误做法:用
model.addAttribute()或普通Model传参,重定向后丢失; - ⚠️ 注意:FlashAttributes 中的对象必须实现
Serializable,否则可能抛出异常(尤其在分布式 session 环境下); - ⚠️ 不要混用
addAttribute()(它只是拼接 URL 查询参数,不安全且有长度限制)。
如何在目标控制器中获取 Flash 属性?
Spring 会在重定向后的目标请求中,自动把 FlashAttributes 合并进 Model。你无需手动操作,但有几种常见方式确保可靠读取:
- 直接在目标 handler 方法参数中声明同名对象(如
String message),Spring 自动绑定; - 用
@ModelAttribute("message") String msg显式指定名称; - 在 Thymeleaf 模板中直接用
${message}或${user.name}访问; - 如果想判断是否来自重定向(比如区分首次访问和跳转而来),可在目标方法中注入
HttpServletRequest并检查request.getAttribute("org.springframework.web.servlet.DispatcherServlet.FLASH_MAP")是否非空(较少用,一般不需要)。
常见陷阱与最佳实践
FlashAttributes 表面简单,但容易因理解偏差导致失效或安全隐患:
- 重定向链不能超过 1 跳:Flash 属性只存活到「下一个」请求,二次重定向后消失;
- 不要在异步 AJAX 重定向中依赖它——浏览器跳转才触发 flash 传递,纯 JS 的
window.location不走 Spring 的 redirect 流程; - 敏感数据(如密码、token)仍需谨慎:虽然不暴露在 URL,但仍在 session 中短暂存在,建议仅传提示信息或 ID,关键数据应查库重建;
- 若需跨多个请求保留(如多步表单),应改用普通 session attribute 或数据库暂存,而非滥用 FlashAttributes。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










