Spring学习笔记_40——@RequestHeader

@RequestHeader

1. 介绍

@RequestHeader 是 Spring 框架中用于在控制器方法中处理 HTTP 请求头(headers)的注解。它允许开发者直接从请求头中读取信息,并将这些信息作为方法参数传递给控制器的方法。这在需要访问特定的请求头信息时非常有用,例如用户代理(User-Agent)、认证信息

2. 场景

@RequestHeader注解在实际开发中有着广泛的应用场景,包括但不限于:

  1. 身份验证:通过获取Authorization请求头的值来进行身份验证。例如,在需要JWT令牌进行身份验证的场景中,可以使用@RequestHeader注解来获取令牌并进行验证。
  2. 用户代理检测:通过获取User-Agent请求头的值来检测用户的浏览器类型和版本,从而提供不同的响应或优化用户体验。
  3. 语言偏好:通过获取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 很方便,但是频繁地使用它可能会对应用的性能产生一定的影响,尤其是在处理大量请求或请求头较多的情况下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值