Skip to content

@RequestHeader

你可以使用 @RequestHeader 注解将请求标头(Header)绑定到控制器的处理方法参数上。

使用示例

假设有如下请求:

text
Host: localhost:8080
Accept-Encoding: gzip,deflate
Keep-Alive: 300

你可以这样获取 Header 的值:

java
@GetMapping("/demo")
public void handle(
		@RequestHeader("Accept-Encoding") String encoding,
		@RequestHeader("Keep-Alive") long keepAlive) {
	// ...
}
kotlin
@GetMapping("/demo")
fun handle(
		@RequestHeader("Accept-Encoding") encoding: String,
		@RequestHeader("Keep-Alive") keepAlive: Long) {
	// ...
}

特性说明

  • 自动转换:如果参数类型不是 String,Spring 会自动应用类型转换。
  • 全量获取:如果注解在 Map<String, String>MultiValueMap<String, String>HttpHeaders 上,参数将包含所有的请求标头。
  • 支持列表:内置支持将逗号分隔的字符串转换为数组或集合(例如 Accept 标头)。

补充教学

1. 常见的自定义 Header 获取

在微服务架构中,常见的做法是通过 Header 传递用户信息或 TraceID。

java
public void track(@RequestHeader("X-User-ID") String userId)

2. 区分标头的大小写

HTTP 标头在规范中是不区分大小写的。Spring MVC 在处理时也会遵循这一原则,因此 Accept-Encodingaccept-encoding 都能正确匹配。

3. @RequestHeader 与 HttpHeaders

如果你需要处理大量 Header,与其在方法签名里写一长串 @RequestHeader,不如直接注入 HttpHeaders 对象:

java
public void check(HttpHeaders headers) {
    List<MediaType> types = headers.getAccept();
    // 这种对象化的操作更加类型安全
}

Based on Spring Framework.