2026-10-19 12:13:35
在Java中获取和解析HTTP请求头信息是Web开发中的常见需求,以下是详细的方法总结和注意事项:
一、使用HttpServletRequest获取请求头适用于基于Servlet的Web应用,通过HttpServletRequest对象直接访问请求头。
核心方法getHeader(String name)获取指定名称的单个请求头值(如User-Agent)。
String userAgent = request.getHeader("User-Agent");getHeaders(String name)获取同一名称的所有请求头值(返回Enumeration<String>),适用于多值头(如Accept-Language)。
Enumeration<String> languages = request.getHeaders("Accept-Language");getHeaderNames()获取所有请求头名称(返回Enumeration<String>),用于遍历全部头信息。
Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); System.out.println(name + ": " + request.getHeader(name));}某些请求头需要特殊处理以提取有效信息。
1. Authorization头(Bearer Token)String authHeader = request.getHeader("Authorization");if (authHeader != null && authHeader.startsWith("Bearer ")) { String token = authHeader.substring(7); // 去除"Bearer "前缀 System.out.println("Token: " + token);}2. Accept-Language头(语言优先级)Enumeration<String> languages = request.getHeaders("Accept-Language");while (languages.hasMoreElements()) { String lang = languages.nextElement(); // 解析语言优先级(如"en-US,en;q=0.9") String[] parts = lang.split(","); for (String part : parts) { String[] langParts = part.split(";q="); System.out.println("Language: " + langParts[0] + ", Priority: " + (langParts.length > 1 ? langParts[1] : "1.0")); }}3. Cookie头String cookieHeader = request.getHeader("Cookie");if (cookieHeader != null) { String[] cookies = cookieHeader.split(";"); for (String cookie : cookies) { String[] pair = cookie.trim().split("="); if (pair.length == 2) { System.out.println("Name: " + pair[0] + ", Value: " + pair[1]); } }}三、Spring MVC中的简化方法Spring框架通过注解提供更简洁的请求头处理方式。
1. 使用@RequestHeader注解映射单个头
@GetMapping("/user")public String getUser(@RequestHeader("User-Agent") String userAgent) { return "Your browser: " + userAgent;}可选头参数通过required = false避免空指针异常:
@GetMapping("/auth")public String auth(@RequestHeader(value = "Authorization", required = false) String auth) { return auth != null ? "Token present" : "No token";}接收所有头到Map
@GetMapping("/headers")public String allHeaders(@RequestHeader Map<String, String> headers) { headers.forEach((key, value) -> System.out.println(key + ": " + value)); return "Headers logged";}空值判断始终检查请求头是否为null,避免NullPointerException。
String header = request.getHeader("Non-Existent-Header");if (header == null) { // 处理缺失头}异常处理解析复杂头(如Authorization)时,捕获格式错误异常:
try { String token = authHeader.substring(7);} catch (StringIndexOutOfBoundsException e) { System.err.println("Invalid Authorization header format");}性能优化避免频繁调用getHeaderNames()或getHeaders(),可缓存结果。
根据项目框架选择合适方法,确保代码健壮性。