@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-Encoding 和 accept-encoding 都能正确匹配。
3. @RequestHeader 与 HttpHeaders
如果你需要处理大量 Header,与其在方法签名里写一长串 @RequestHeader,不如直接注入 HttpHeaders 对象:
java
public void check(HttpHeaders headers) {
List<MediaType> types = headers.getAccept();
// 这种对象化的操作更加类型安全
}