Skip to content

@SessionAttributes

@SessionAttributes 用于在请求之间将模型属性存储在 HTTP Servlet 会话(Session)中。这是一个类级别的注解,声明了特定控制器使用的会话属性。

使用示例

java
@Controller
@SessionAttributes("pet") // 声明名为 "pet" 的模型属性应存储在 Session 中
public class EditPetForm {
	// ...
}
kotlin
@Controller
@SessionAttributes("pet")
class EditPetForm {
	// ...
}

工作流程

  1. 存入:当控制器向 Model 中添加名为 pet 的属性时,Spring 也会自动将其同步到 Session 中。
  2. 取出:在后续请求中,如果方法参数有 @ModelAttribute("pet"),Spring 会先尝试从 Session 中找。
  3. 清理:属性会一直保留,直到你调用 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)

当你需要一个三步注册流程时:

  1. 第一步:填写基本信息,存入 @SessionAttributes
  2. 第二步:填写详细信息,Spring 自动把 Session 里的对象拿出来让你继续填。
  3. 第三步:确认提交,调用 setComplete() 销毁对象,避免占用服务器内存。

3. 注意异常:HttpSessionRequiredException

如果你在类上声明了 @SessionAttributes("user"),但请求进来时 Session 里没有这个对象(比如用户直接刷新了第二步的 URL),Spring 会抛出异常。 对策:通常配合一个 @ModelAttribute 方法来确保对象在第一次请求时被创建并放入模型。

Based on Spring Framework.