@RequestHeader
注解,它用于将 HTTP 请求的头部信息注入到控制器方法的参数中。这个功能在处理需要根据请求头部来做决策的业务逻辑时非常有用,例如,根据用户的 Accept
头部返回不同格式的响应,或者根据 Authorization
头部验证用户身份。
注解设计结构
业务场景:
例如开发一个 RESTful API,该 API 需要根据客户端请求的 Accept
头部来返回 JSON 或 XML 格式的响应。此外,还需要根据 Authorization
头部验证用户身份。
1. 根据 Accept
头部返回不同格式的响应:
Java
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;
@RestController
public class ProductController {
@GetMapping("/products")
public ResponseEntity<Product> getProducts(@RequestHeader(value = "Accept", required = false) String acceptHeader) {
Product product = productService.getProduct();
if (MediaType.APPLICATION_XML_VALUE.equalsIgnoreCase(acceptHeader)) {
return ResponseEntity.ok().contentType(MediaType.APPLICATION_XML).body(product);
} else {
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(product);
}
}
}
在这个例子中,@RequestHeader
注解用于获取 Accept
头部的值,并根据该值返回不同格式的响应。
2. 验证 Authorization
头部:
java
public class SecurityInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String authorizationHeader = request.getHeader("Authorization");
if (authorizationHeader == null || !authorizationService.validateToken(authorizationHeader)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
return true;
}
}
在这个安全拦截器中,我们使用 HttpServletRequest
的 getHeader
方法来获取 Authorization
头部的值,并验证它是否有效。
3. 注册拦截器:
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SecurityInterceptor());
}
}
4. 客户端请求:
客户端在发送请求时,需要在请求头部中包含 Accept
和 Authorization
。
注解属性说明
@RequestHeader
注解的属性说明:
-
value:
- 类型:
String
- 作用:指定要提取的 HTTP 请求头部的名称。这是必需的属性。
- 类型:
-
name:
- 类型:
String
- 作用:提供用于绑定的参数名称,如果指定,将使用此名称而不是
value
属性的值。这在你想要将请求头部名称与方法参数名称区分开来时非常有用。
- 类型:
-
defaultValue:
- 类型:
String
- 作用:指定一个默认值,如果在请求中没有找到指定的请求头部,或者请求头部的值为空字符串,则使用此默认值。如果没有指定默认值,且请求头部不存在或为空,则注入
null
。
- 类型:
-
required:
- 类型:
boolean
- 默认值:
true
- 作用:指示是否必须在请求中找到指定的请求头部。如果设置为
true
(默认值),则必须存在具有指定名称的请求头部,否则将抛出异常。如果设置为false
,则在找不到请求头部时注入null
或defaultValue
(如果有的话)。
- 类型:
总结:
@RequestHeader
注解允许开发者访问 HTTP 请求的头部信息,并根据这些信息来处理业务逻辑。- 它提供了一种灵活的方式来处理基于请求头部的决策,例如响应格式的协商或安全验证。
- 使用
@RequestHeader
注解可以提高代码的可读性和可维护性,尤其是在处理复杂的请求头部逻辑时。