Spring Boot 中如何使用 `@RequestHeader` 注解

devtools/2025/3/13 14:00:06/

文章目录

      • 学习文章:Spring Boot 中如何使用 `@RequestHeader` 注解
    • 一、`@RequestHeader` 注解简介
      • 常用属性:
    • 二、基本用法
      • 1. 提取单个请求头
      • 2. 处理可选请求头
    • 三、提取多个请求头
      • 1. 使用多个 `@RequestHeader` 注解
      • 2. 使用 `Map` 提取所有请求头
    • 四、处理多值请求头
      • 示例:提取 `Accept` 头的多个值
    • 五、实际应用场景
      • 1. 认证和授权
      • 2. 内容协商
      • 3. 国际化
    • 六、注意事项
    • 七、总结


学习文章:Spring Boot 中如何使用 @RequestHeader 注解

在 Spring Boot 开发中,HTTP 请求头(Header)是客户端和服务器之间传递元数据的重要方式。通过请求头,客户端可以传递认证信息、内容类型、语言偏好等数据。Spring Boot 提供了 @RequestHeader 注解,用于方便地从 HTTP 请求头中提取数据。

本文将详细介绍 @RequestHeader 注解的使用方法,包括基本用法、默认值处理、多值头处理以及实际应用场景。


一、@RequestHeader 注解简介

@RequestHeader 是 Spring MVC 提供的一个注解,用于将 HTTP 请求头中的值绑定到控制器方法的参数上。它的主要作用是从请求头中提取数据,并将其注入到方法参数中。

常用属性:

  • valuename:指定请求头的名称。
  • required:指示请求头是否必须存在(默认值为 true)。
  • defaultValue:当请求头不存在时使用的默认值。

二、基本用法

1. 提取单个请求头

以下示例展示了如何从请求头中提取 User-Agent 信息。

java">import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HeaderController {@GetMapping("/user-agent")public String getUserAgent(@RequestHeader("User-Agent") String userAgent) {return "User-Agent: " + userAgent;}
}

测试:
访问 http://localhost:8080/user-agent,返回结果如下:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36

2. 处理可选请求头

如果请求头是可选的,可以设置 required = false,并提供一个默认值。

java">@GetMapping("/optional-header")
public String getOptionalHeader(@RequestHeader(value = "Custom-Header", required = false, defaultValue = "默认值") String customHeader) {return "Custom-Header: " + customHeader;
}

测试:

  • 如果请求中包含 Custom-Header,则返回该值。
  • 如果请求中不包含 Custom-Header,则返回默认值。

三、提取多个请求头

1. 使用多个 @RequestHeader 注解

可以同时提取多个请求头。

java">@GetMapping("/multiple-headers")
public String getMultipleHeaders(@RequestHeader("User-Agent") String userAgent,@RequestHeader("Accept-Language") String acceptLanguage) {return "User-Agent: " + userAgent + ", Accept-Language: " + acceptLanguage;
}

2. 使用 Map 提取所有请求头

如果需要提取所有请求头,可以使用 Map<String, String>MultiValueMap<String, String>

java">import java.util.Map;@GetMapping("/all-headers")
public String getAllHeaders(@RequestHeader Map<String, String> headers) {return "Headers: " + headers.toString();
}

测试:
访问 http://localhost:8080/all-headers,返回结果如下:

Headers: {host=localhost:8080, user-agent=Mozilla/5.0, accept-language=en-US,en;q=0.9}

四、处理多值请求头

某些请求头可能包含多个值(如 Accept 头),可以使用 List<String>MultiValueMap<String, String> 来提取。

示例:提取 Accept 头的多个值

java">import java.util.List;@GetMapping("/accept-header")
public String getAcceptHeader(@RequestHeader("Accept") List<String> acceptHeaders) {return "Accept Headers: " + acceptHeaders.toString();
}

测试:
访问 http://localhost:8080/accept-header,返回结果如下:

Accept Headers: [text/html, application/xhtml+xml, application/xml;q=0.9]

五、实际应用场景

1. 认证和授权

在 RESTful API 中,通常使用请求头传递认证信息(如 Authorization 头)。

java">@GetMapping("/auth")
public String auth(@RequestHeader("Authorization") String authToken) {// 验证 token 的逻辑return "Auth Token: " + authToken;
}

2. 内容协商

通过 Accept 头实现内容协商,返回客户端期望的内容类型。

java">@GetMapping("/content")
public String content(@RequestHeader("Accept") String acceptHeader) {if (acceptHeader.contains("application/json")) {return "{\"message\": \"JSON Response\"}";} else {return "Plain Text Response";}
}

3. 国际化

通过 Accept-Language 头实现多语言支持。

java">@GetMapping("/greeting")
public String greeting(@RequestHeader("Accept-Language") String acceptLanguage) {if (acceptLanguage.startsWith("zh")) {return "你好!";} else {return "Hello!";}
}

六、注意事项

  1. 请求头名称区分大小写:HTTP 请求头的名称是大小写不敏感的,但 @RequestHeader 注解中的名称是大小写敏感的。
  2. 默认值处理:如果请求头不存在且未设置 defaultValue,且 required = true,则会抛出 MissingRequestHeaderException
  3. 多值头的处理:对于多值请求头,使用 List<String>MultiValueMap<String, String> 来提取。

七、总结

通过本文的学习,你应该掌握了以下内容:

  1. 如何使用 @RequestHeader 注解提取单个请求头。
  2. 如何处理可选请求头和默认值。
  3. 如何提取多个请求头或所有请求头。
  4. 如何处理多值请求头。
  5. @RequestHeader 的实际应用场景和注意事项。

@RequestHeader 是 Spring Boot 中处理 HTTP 请求头的强大工具,合理使用可以显著提升代码的可读性和灵活性。希望本文对你有所帮助,欢迎在评论区分享你的学习心得和问题!


http://www.ppmy.cn/devtools/166789.html

相关文章

植物学(botany)这个单词怎么记?牛吃草,草是一种植物

植物学&#xff08;botany&#xff09;这个单词怎么记&#xff1f; botany n.植物学 botany 这个单词&#xff0c;词源上来自 botanic 一词&#xff1a; botanic a.植物学的 SYN: botanical(a.植物学的) 因此&#xff0c;英语词根botan-&#xff0c;意为“植物”。比如&…

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍&#xff1a;使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径&#xff0c;之后一直点“下一步”直到完成 2 添加元器件 点击元…

Mysql高频面试题

MVCC相关面试题 1.什么是 MVCC?它解决了什么问题? 答:MVCC 是多版本并发控制机制,它通过维护数据多个版本,实现非锁定读,解决了读写互斥问题,通过保存数据的多个版本,让读操作可以在不获取锁的情况下读取数据,提高了并发性能。同时,MVCC 还能保证事务的隔离性,例如…

CopyOnWriteArrayList 的实现原理和适用场景(源码)

CopyOnWriteArrayList的实现原理 目录 CopyOnWriteArrayList的实现原理核心源码解读&#xff08;1&#xff09;数据结构&#xff1a;采用数组&#xff08;2&#xff09;初始化&#xff08;3&#xff09;add 操作&#xff08;4&#xff09;get操作&#xff08;5&#xff09;remo…

Pygame实现射击鸭子游戏3-3

6 游戏配置设置 游戏配置设置的代码如图10所示。 图10 游戏配置设置的代码 其中&#xff0c;第32行代码初始化pygame&#xff1b;第33-34行代码设置了屏幕的宽度和高度&#xff1b;第35行代码设置了鸭子的数量&#xff1b;第36行代码创建屏幕&#xff1b;第37行代码设置屏幕的…

SQL-留存率

一、留存率业务含义 留存率可以评用户对产品的粘性&#xff0c;留存率越低用户对产品的粘性越小 留存率通常分为次日留存率、3日留存率、7日留存率、30日留存率 这里以新增用户留存率为例&#xff1a; 次日留存率&#xff1a;(基准日之后的第1天留存的用户数)/基准日当天新…

C++和标准库速成(一)——HelloWorld和名称空间

目录 1. 引言1. 简单小程序"Hello World"1.1 模块导入1.2 预处理指令1.2.1 简介1.2.2 常用的预处理指令 1.3 main()函数1.4 输入输出流1.4.1 输出流1.4.2 转义字符1.4.3 输入流 2. 名称空间2.1 定义名称空间2.2 using指令2.3 嵌套名称空间2.4 名称空间别名 参考 1. 引…

【抽奖项目】|第三篇

前言&#xff1a; 高并发的活动预热肯定不可以在数据库操作&#xff0c;需要redis&#xff0c;特别是这种秒杀活动更是需要注意&#xff0c;所以可以在高并发的前夕先进行活动预热。 上一篇写完了怎么样活动预热&#xff0c;可以看看这篇写怎么样高并发抽奖接口 【抽奖项目】|第…