Skip to content

@RequestAttribute

类似于 @SessionAttribute,你可以使用 @RequestAttribute 注解来访问先前创建的(例如由 Servlet FilterHandlerInterceptor 创建)请求范围内的属性。

使用示例

java
@GetMapping("/")
public String handle(@RequestAttribute Client client) {
	// 访问当前请求中名为 "client" 的属性
	return "index";
}
kotlin
@GetMapping("/")
fun handle(@RequestAttribute client: Client): String {
	// 访问当前请求中名为 "client" 的属性
	return "index"
}

补充教学

1. 它是怎么放进去的?

通常你在过滤器的 doFilter 方法里写:

java
request.setAttribute("client", clientObject);

或者在拦截器的 preHandle 方法里做类似的操作。@RequestAttribute 让你在 Controller 里优雅地把它们“取”出来。

2. 与 @RequestParam 的区别

这是新手常犯的错误:

  • @RequestParam:拿的是客户端传过来的数据(URL 参数或表单)。
  • @RequestAttribute:拿的是服务器自己放进去的数据(通常由之前的代码逻辑产生)。

3. 应用场景:多租户与追踪

在多租户系统中,你可能有一个拦截器根据域名解析出 Tenant 对象并存入 Request。通过这个注解,所有下游的 Controller 都可以无感地获取当前租户信息。

Based on Spring Framework.