@requestheader用于提取http请求头值,支持单值绑定、默认值设置(required=false时)、multivaluemap获取全部头,以及枚举和自定义类型转换。

在 Spring MVC 中,@RequestHeader 注解用于从 HTTP 请求头中提取指定字段的值,非常适用于读取 Authorization、User-Agent、Accept-Language 等标准或自定义请求头。
基本用法:直接绑定单个请求头
最常见的方式是将 @RequestHeader 加在控制器方法参数上,Spring 会自动从请求头中查找对应名称的值并注入:
- 若请求头存在且非空,值被自动转换为参数类型(如 String、int、long 等)
- 若请求头不存在,默认会抛出
MissingRequestHeaderException
示例:
@GetMapping("/api/user")
public ResponseEntity<string> getUser(@RequestHeader("User-Agent") String userAgent) {
return ResponseEntity.ok("Detected: " + userAgent);
}</string>
设置默认值与可选性
通过 required = false 和 defaultValue 可避免因请求头缺失导致异常,并提供兜底逻辑:
-
required = false表示该请求头不是必须的 -
defaultValue在请求头缺失或为空时使用该默认值(注意:仅当required = false时生效)
示例:
@GetMapping("/api/data")
public String getData(@RequestHeader(value = "X-Trace-ID", required = false, defaultValue = "unknown") String traceId) {
return "Trace ID: " + traceId;
}
获取全部请求头:使用 Map 或 MultiValueMap
当需要访问所有请求头,或某个头可能有多个值(如 Cookie、Accept),推荐使用 MultiValueMap<string string></string>:
-
MultiValueMap能正确处理重复头(如多个Set-Cookie) -
Map<string string></string>只保留每个头的最后一个值,不推荐用于多值场景
示例:
@GetMapping("/api/headers")
public Map<string string> getAllHeaders(@RequestHeader MultiValueMap<string string> headers) {
Map<string string> result = new HashMap();
headers.forEach((key, values) -> result.put(key, String.join(", ", values)));
return result;
}</string></string></string>
配合其他注解与类型转换
@RequestHeader 支持类型转换和自定义解析,例如:
- 绑定到枚举类型(需保证请求头值能匹配枚举名或自定义
toString()/fromString()) - 绑定到自定义对象时,需注册对应的
Converter或使用@InitBinder - 支持 SpEL 表达式(如
@RequestHeader("#{request.getHeader('X-Env')?: 'prod'}"),但较少用,建议优先用defaultValue
简单枚举示例:
public enum ApiVersion { V1, V2 }
@GetMapping("/api/resource")
public String handle(@RequestHeader("X-API-Version") ApiVersion version) {
return "Using version: " + version;
}
不复杂但容易忽略细节。只要注意 required、defaultValue 和 MultiValueMap 的适用场景,就能稳妥地拿到请求头信息。











