在HttpServletRequest中,有多种方法可以获取请求头信息。以下是常用的几种方法:
1. 获取所有请求头名称
// 获取所有请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
// 遍历所有请求头名称
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
// 处理每个请求头名称
}
2. 获取特定请求头的值
// 获取单个请求头的值(返回第一个值)
String contentType = request.getHeader("Content-Type");
// 获取单个请求头的所有值(允许多个值)
Enumeration<String> acceptHeaders = request.getHeaders("Accept");
// 遍历特定请求头的多个值
while (acceptHeaders.hasMoreElements()) {
String value = acceptHeaders.nextElement();
System.out.println(value);
}
3. 将请求头转换为Map格式
// 将请求头转换为Map<String, String>(同名请求头只取第一个值)
Map<String, String> headersMap = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
headersMap.put(headerName, request.getHeader(headerName));
}
4. 将请求头转换为Map<String, List<String>>(支持多值)
// 将请求头转换为Map<String, List<String>>
Map<String, List<String>> headersMapWithList = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
List<String> headerValues = new ArrayList<>();
Enumeration<String> values = request.getHeaders(headerName);
while (values.hasMoreElements()) {
headerValues.add(values.nextElement());
}
headersMapWithList.put(headerName, headerValues);
}
5. 使用Java 8 Stream API处理
// 使用Stream API转换为Map
Map<String, String> headers = Collections.list(request.getHeaderNames())
.stream()
.collect(Collectors.toMap(
Function.identity(),
request::getHeader
));
// 转换为Map<String, List<String>>
Map<String, List<String>> headersWithList = Collections.list(request.getHeaderNames())
.stream()
.collect(Collectors.toMap(
Function.identity(),
name -> Collections.list(request.getHeaders(name))
));
6. 完整示例方法
import javax.servlet.http.HttpServletRequest;
import java.util.*;
public class HeadersUtils {
/**
* 获取所有请求头(同名请求头只取第一个值)
*/
public static Map<String, String> getAllHeaders(HttpServletRequest request) {
Map<String, String> headers = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
headers.put(headerName, request.getHeader(headerName));
}
return headers;
}
/**
* 获取所有请求头(支持多值)
*/
public static Map<String, List<String>> getAllHeadersWithList(HttpServletRequest request) {
Map<String, List<String>> headers = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
List<String> values = new ArrayList<>();
Enumeration<String> headerValues = request.getHeaders(headerName);
while (headerValues.hasMoreElements()) {
values.add(headerValues.nextElement());
}
headers.put(headerName, values);
}
return headers;
}
/**
* 打印所有请求头
*/
public static void printAllHeaders(HttpServletRequest request) {
Enumeration<String> headerNames = request.getHeaderNames();
System.out.println("===== Request Headers =====");
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
System.out.print(headerName + ": ");
Enumeration<String> headerValues = request.getHeaders(headerName);
while (headerValues.hasMoreElements()) {
System.out.print(headerValues.nextElement());
if (headerValues.hasMoreElements()) {
System.out.print(", ");
}
}
System.out.println();
}
System.out.println("===========================");
}
}
注意事项
-
大小写不敏感:获取请求头时,键名是大小写不敏感的
-
多值请求头 :如Accept、Cookie等可能有多个值,使用
getHeaders()获取枚举 -
常用请求头:
-
Content-Type
-
User-Agent
-
Authorization
-
Cookie
-
Accept
-
Accept-Language
-
-
空值处理 :如果请求头不存在,
getHeader()返回null
在Spring Boot中的使用
@RestController
public class HeadersController {
@GetMapping("/headers")
public Map<String, String> getAllHeaders(@RequestHeader Map<String, String> headers) {
// Spring会自动注入所有请求头
return headers;
}
@GetMapping("/headers-with-annotation")
public void getSpecificHeaders(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value = "X-Custom-Header", required = false) String customHeader) {
// 获取特定请求头
}
}
选择哪种方法取决于具体需求:
-
如果只需要部分请求头,使用
getHeader(name) -
如果需要处理同名多值请求头,使用
getHeaders(name) -
如果需要所有请求头,建议使用方法4或5转换为Map