在现代 Web 开发中,HTTP 请求头(Header)是客户端与服务器之间传递信息的重要方式之一。常见的场景包括:
Cookie 传递会话信息。Authorization 头传递身份验证 Token。本文将详细介绍如何在 Java 后端(以 Spring Boot 为例)中提取请求头中的 Cookie 和 Token,并提供完整的代码示例和优化建议。
HTTP 请求头是客户端(如浏览器)发送给服务器的附加信息,用于传递元数据。常见的请求头包括:
Cookie:用于传递客户端存储的会话信息。Authorization:用于传递身份验证信息,如 JWT Token。在后端开发中,提取请求头中的信息是常见的需求。例如:
Authorization 头中提取 Token,验证用户身份。Cookie 中提取会话 ID,维护用户会话状态。Spring Boot 提供了多种方式来处理 HTTP 请求头。以下是几种常见的方法:
@RequestHeader 注解@RequestHeader 注解可以直接将请求头中的值绑定到方法的参数上。
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("/example")
public String getHeaders(
@RequestHeader("Cookie") String cookie, // 提取 Cookie
@RequestHeader("Authorization") String token // 提取 Token
) {
return "Cookie: " + cookie + ", Token: " + token;
}
}@RequestHeader("Cookie"):提取请求头中的 Cookie。@RequestHeader("Authorization"):提取请求头中的 Token(通常放在 Authorization 头中)。如果请求头中没有指定的字段,Spring 会抛出 MissingRequestHeaderException。可以通过 required = false 设置为可选参数:
@RequestHeader(value = "Cookie", required = false) String cookieHttpServletRequest通过 HttpServletRequest 对象,可以手动获取请求头中的值。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class HeaderController {
@GetMapping("/example")
public String getHeaders(HttpServletRequest request) {
String cookie = request.getHeader("Cookie"); // 提取 Cookie
String token = request.getHeader("Authorization"); // 提取 Token
return "Cookie: " + cookie + ", Token: " + token;
}
}request.getHeader("Cookie"):获取 Cookie 头的值。request.getHeader("Authorization"):获取 Authorization 头的值。@CookieValue 注解如果 Cookie 是以键值对的形式传递的(例如 Cookie: name=value),可以使用 @CookieValue 注解提取特定的 Cookie 值。
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HeaderController {
@GetMapping("/example")
public String getCookie(
@CookieValue("sessionId") String sessionId // 提取特定的 Cookie 值
) {
return "Session ID: " + sessionId;
}
}@CookieValue("sessionId"):提取名为 sessionId 的 Cookie 值。如果 Cookie 不存在,Spring 会抛出 MissingRequestCookieException。可以通过 required = false 设置为可选参数:
@CookieValue(value = "sessionId", required = false) String sessionIdToken 通常放在 Authorization 头中,格式为 Bearer <token>。我们需要提取 Bearer 后面的部分。
@RequestHeader 和字符串处理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("/example")
public String getToken(
@RequestHeader("Authorization") String authHeader // 提取 Authorization 头
) {
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7); // 提取 Bearer 后面的部分
return "Token: " + token;
} else {
return "Invalid Authorization header";
}
}
}authHeader.startsWith("Bearer "):检查 Authorization 头是否以 Bearer 开头。authHeader.substring(7):提取 Bearer 后面的 Token。HttpServletRequest 和字符串处理import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class HeaderController {
@GetMapping("/example")
public String getToken(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization"); // 提取 Authorization 头
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7); // 提取 Bearer 后面的部分
return "Token: " + token;
} else {
return "Invalid Authorization header";
}
}
}以下是一个综合示例,提取 Cookie 和 Token,并返回处理结果:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class HeaderController {
@GetMapping("/example")
public String getHeaders(
@RequestHeader(value = "Cookie", required = false) String cookie, // 提取 Cookie
@RequestHeader(value = "Authorization", required = false) String authHeader // 提取 Authorization 头
) {
// 处理 Cookie
String cookieInfo = (cookie != null) ? "Cookie: " + cookie : "No Cookie provided";
// 处理 Token
String tokenInfo;
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7); // 提取 Bearer 后面的部分
tokenInfo = "Token: " + token;
} else {
tokenInfo = "Invalid or missing Authorization header";
}
return cookieInfo + ", " + tokenInfo;
}
}可以使用 Postman 或 curl 测试接口:
curl -X GET http://localhost:8080/example \
-H "Cookie: sessionId=abc123" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."{
"Cookie": "sessionId=abc123",
"Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}在 Java 后端(Spring Boot)中提取请求头中的 Cookie 和 Token 有多种方式:
@RequestHeader 注解:适合直接绑定请求头到方法参数。HttpServletRequest:适合需要动态处理请求头的场景。@CookieValue 注解:适合提取特定的 Cookie 值。对于 Token,通常需要从 Authorization 头中提取 Bearer 后面的部分。通过合理的异常处理和参数校验,可以确保代码的健壮性和可维护性。
希望本文对你有所帮助!如果有任何问题,欢迎在评论区留言。