Skip to content

@SessionAttribute

当你需要访问预先存在的、由全局管理的(例如由 Filter 或拦截器创建)且可能存在也可能不存在的会话属性时,可以在方法参数上使用 @SessionAttribute 注解。

使用示例

java
@GetMapping("/")
public String handle(@SessionAttribute User user) {
	// 自动从 HttpSession 中获取名为 "user" 的属性
	return "index";
}
kotlin
@GetMapping("/")
fun handle(@SessionAttribute user: User): String {
	// 自动从 HttpSession 中获取名为 "user" 的属性
	return "index"
}

特性说明

  • 只读访问:它主要用于方便地读取数据。如果你需要频繁地在 Session 中增加或删除属性,建议通过注入 HttpSessionWebRequest 来操作。
  • 必需性:默认是 required=true。如果 Session 中没有该属性,会抛出异常。可以设置为 false

补充教学

1. 它是 @SessionAttributes 的表亲吗?

不,它们用途完全不同!

  • @SessionAttributes (类级别):用于控制器内的工作流(如多步骤表单数据暂存)。
  • @SessionAttribute (参数级别):用于访问外部放进去的数据(如登录后的用户信息 CurrentUser)。

2. 避免 NullPointerException

如果属性是可选的,推荐这样写:

java
public void handle(@SessionAttribute(required = false) User user) {
    if (user != null) { ... }
}

或者在 Spring 5.0+ 中使用 Optional<User>

3. 应用场景:权限检查与审计

在很多系统中,用户登录信息是由一个全局 Filter 放入 Session 的。通过 @SessionAttribute,你可以在任何 Controller 中直接拿到经过类型转换好的用户对象,而不需要再写冗长的 session.getAttribute(...) 并手动强转。

Based on Spring Framework.