@RequestHeader
1. 介绍
@RequestHeader
是 Spring 框架中用于在控制器方法中处理 HTTP 请求头(headers)的注解。它允许开发者直接从请求头中读取信息,并将这些信息作为方法参数传递给控制器的方法。这在需要访问特定的请求头信息时非常有用,例如用户代理(User-Agent)、认证信息
2. 场景
@RequestHeader注解在实际开发中有着广泛的应用场景,包括但不限于:
- 身份验证:通过获取Authorization请求头的值来进行身份验证。例如,在需要JWT令牌进行身份验证的场景中,可以使用@RequestHeader注解来获取令牌并进行验证。
- 用户代理检测:通过获取User-Agent请求头的值来检测用户的浏览器类型和版本,从而提供不同的响应或优化用户体验。
- 语言偏好:通过获取Accept-Language请求头的值来确定用户的语言偏好,从而返回不同语言的响应内容。
3. 源码
/*
* @author Juergen Hoeller
* @author Sam Brannen
* @since 3.0
* @see RequestMapping
* @see RequestParam
* @see CookieValue
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
// String类型的属性,用于指定消息头的名称。
@AliasFor("name")
String value() default "";
// Spring从4.2版本开始提供的String类型的属性,作用与value属性相同
@AliasFor("value")
String name() default "";
// boolean类型的属性,用于指定是否必须有此消息头。
// true:必须有
// false:非必须有
// 如果设置为true时,请求中没有此消息头会强制报错。
// 默认为true
boolean required() default true;
// String类型的属性,用于指定消息头的默认值
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
4. Demo
- 默认值
@GetMapping("/example")
public String handleRequest(@RequestHeader(value = "X-My-Header", defaultValue = "default-value") String myHeader) {
// 即使 X-My-Header 不存在,myHeader 也会有一个默认值
return "X-My-Header: " + myHeader;
}
- 单个请求头
@GetMapping("/example")
public String handleRequest(@RequestHeader("User-Agent") String userAgent) {
// 使用 userAgent 变量
return "User-Agent: " + userAgent;
}
- 所有请求头
@GetMapping("/example")
public String handleRequest(@RequestHeader Map<String, String> headers) {
// 遍历 headers map
headers.forEach((key, value) -> System.out.println(key + ": " + value));
return "Headers processed.";
}
- 绑定到对象
public class MyHeaders {
private String userAgent;
private String acceptLanguage;
// getters and setters
}
@GetMapping("/example")
public String handleRequest(@RequestHeader MyHeaders headers) {
// 使用 headers 对象
return "Headers: " + headers.getUserAgent() + ", " + headers.getAcceptLanguage();
}
5. 注意事项
- 大小写敏感:HTTP 头名称是大小写不敏感的,但是
@RequestHeader
注解会按照提供的大小写去查找对应的头。如果找不到完全匹配的头,那么即使有相同名称不同大小写的头也不会被自动绑定。 - 性能影响:虽然
@RequestHeader
很方便,但是频繁地使用它可能会对应用的性能产生一定的影响,尤其是在处理大量请求或请求头较多的情况下。