@SessionAttributes
@SessionAttributes 用于在请求之间将模型属性存储在 HTTP Servlet 会话(Session)中。这是一个类级别的注解,声明了特定控制器使用的会话属性。
使用示例
java
@Controller
@SessionAttributes("pet") // 声明名为 "pet" 的模型属性应存储在 Session 中
public class EditPetForm {
// ...
}kotlin
@Controller
@SessionAttributes("pet")
class EditPetForm {
// ...
}工作流程
- 存入:当控制器向
Model中添加名为pet的属性时,Spring 也会自动将其同步到 Session 中。 - 取出:在后续请求中,如果方法参数有
@ModelAttribute("pet"),Spring 会先尝试从 Session 中找。 - 清理:属性会一直保留,直到你调用
SessionStatus.setComplete()。
java
@PostMapping("/save")
public String handle(Pet pet, SessionStatus status) {
// 处理逻辑...
status.setComplete(); // 处理完成,清理 Session 里的属性
return "redirect:/done";
}补充教学
1. 它与原生 HttpSession 的区别
- HttpSession:全局的,受 Servlet 容器管理。
- @SessionAttributes:属于当前控制器的“临时”会话存储。它主要用于跨页面的表单处理(对话模型)。
- 注意:它存储的是模型数据的副本。只有在方法正常返回后,更改才会同步回 Session。
2. 核心场景:多步骤表单 (Wizard)
当你需要一个三步注册流程时:
- 第一步:填写基本信息,存入
@SessionAttributes。 - 第二步:填写详细信息,Spring 自动把 Session 里的对象拿出来让你继续填。
- 第三步:确认提交,调用
setComplete()销毁对象,避免占用服务器内存。
3. 注意异常:HttpSessionRequiredException
如果你在类上声明了 @SessionAttributes("user"),但请求进来时 Session 里没有这个对象(比如用户直接刷新了第二步的 URL),Spring 会抛出异常。 对策:通常配合一个 @ModelAttribute 方法来确保对象在第一次请求时被创建并放入模型。