@RequestHeader 和 @CookieValue 注解的作用分别是什么?
这两个注解都是 Spring MVC 框架中用于从 HTTP 请求中提取特定信息的注解。它们通常用在 Controller(控制器)方法的参数上。
简单来说:
@RequestHeader用于获取 请求头(Header) 中的值。- @CookieValue 用于获取 Cookie 中的值。
下面是详细的解释和代码示例:
1. @RequestHeader
作用
将 HTTP 请求头(Request Header)中的某个属性值映射到 Controller 方法的参数上。
常用场景
- 获取认证信息(如
Authorization头中的 Token)。 - 获取客户端信息(如
User-Agent)。 - 获取主机信息(
Host)。 - 获取内容类型或编码(
Content-Type,Accept-Language)。
代码示例
java
@GetMapping("/headerInfo")
public String getHeaderInfo(
// 1. 获取名为 "User-Agent" 的请求头
@RequestHeader("User-Agent") String userAgent,
// 2. 获取名为 "Accept-Language" 的请求头
@RequestHeader("Accept-Language") String language,
// 3. 获取名为 "My-Custom-Header" 的头,如果不存在则使用默认值 "default"
@RequestHeader(value = "My-Custom-Header", defaultValue = "default") String customHeader,
// 4. 获取所有请求头,映射为 Map
@RequestHeader Map<String, String> allHeaders
) {
System.out.println("User Agent: " + userAgent);
System.out.println("Language: " + language);
return "success";
}
2. @CookieValue
作用
将 HTTP 请求中携带的 Cookie 值映射到 Controller 方法的参数上。
常用场景
- 获取会话 ID(如
JSESSIONID)。 - 获取用户在客户端保存的偏好设置。
- 获取用于自动登录的 Token。
代码示例
java
@GetMapping("/cookieInfo")
public String getCookieInfo(
// 1. 获取名为 "JSESSIONID" 的 Cookie 值
@CookieValue("JSESSIONID") String sessionId,
// 2. 获取名为 "user_preference" 的 Cookie,如果不存在不报错(required=false)
@CookieValue(value = "user_preference", required = false) String userPref,
// 3. 将 Cookie 映射为 javax.servlet.http.Cookie 对象(可以获取更多信息如 path, domain)
@CookieValue("JSESSIONID") Cookie cookieObj
) {
System.out.println("Session ID: " + sessionId);
if (userPref != null) {
System.out.println("User Preference: " + userPref);
}
return "success";
}
3. 共同属性与注意事项
这两个注解拥有相同的三个关键属性:
| 属性名 | 类型 | 描述 |
|---|---|---|
value (或 name) |
String | 指定要获取的 Header 或 Cookie 的名称。 |
required |
boolean | 默认为 true。如果请求中缺少该 Header/Cookie,Spring 会抛出 400 Bad Request 异常。如果设置为 false,则参数值为 null。 |
defaultValue |
String | 如果请求中缺少该 Header/Cookie,则使用此默认值(此时 required 属性会被忽略)。 |
总结对比
| 特性 | @RequestHeader | @CookieValue |
|---|---|---|
| 数据来源 | HTTP 协议的 Header 部分 | HTTP 协议 Header 中的 Cookie 字段 |
| 主要用途 | 获取元数据(如认证Token、客户端类型、编码格式) | 获取状态数据(如 SessionID、用户标识) |
| 类型转换 | Spring 会自动尝试将 String 转换为参数类型(如 int, long, Date 等) | 同左 |