@RequestHeader头部验证用户身份案例

@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;
    }
}

在这个安全拦截器中,我们使用 HttpServletRequestgetHeader 方法来获取 Authorization 头部的值,并验证它是否有效。

3. 注册拦截器:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SecurityInterceptor());
    }
}

4. 客户端请求:

客户端在发送请求时,需要在请求头部中包含 AcceptAuthorization

注解属性说明

@RequestHeader 注解的属性说明:

  1. value:

    • 类型:String
    • 作用:指定要提取的 HTTP 请求头部的名称。这是必需的属性。
  2. name:

    • 类型:String
    • 作用:提供用于绑定的参数名称,如果指定,将使用此名称而不是 value 属性的值。这在你想要将请求头部名称与方法参数名称区分开来时非常有用。
  3. defaultValue:

    • 类型:String
    • 作用:指定一个默认值,如果在请求中没有找到指定的请求头部,或者请求头部的值为空字符串,则使用此默认值。如果没有指定默认值,且请求头部不存在或为空,则注入 null
  4. required:

    • 类型:boolean
    • 默认值:true
    • 作用:指示是否必须在请求中找到指定的请求头部。如果设置为 true(默认值),则必须存在具有指定名称的请求头部,否则将抛出异常。如果设置为 false,则在找不到请求头部时注入 nulldefaultValue(如果有的话)。

总结:

  • @RequestHeader 注解允许开发者访问 HTTP 请求的头部信息,并根据这些信息来处理业务逻辑。
  • 它提供了一种灵活的方式来处理基于请求头部的决策,例如响应格式的协商或安全验证。
  • 使用 @RequestHeader 注解可以提高代码的可读性和可维护性,尤其是在处理复杂的请求头部逻辑时。
相关推荐
Tadas-Gao1 分钟前
从“驯马”到“驭队”:Harness Engineering 如何重构 AI 产品化的底层逻辑
人工智能·语言模型·架构·大模型·llm·harness
wasp5209 分钟前
从 Vibe Coding 到真·生产力:OpenHarness 的“Harness 方程式”及其实战分析
人工智能·架构·开源·agent
OpenCSG10 分钟前
OpenClaw × AgenticHub 架构解析:智能体系统如何真正具备执行能力
架构
小旭952712 分钟前
Spring Security 实现权限控制(认证 + 授权全流程)
java·后端·spring
weixin_4080996713 分钟前
【完整教程】天诺脚本如何调用 OCR 文字识别 API?自动识别屏幕文字实战(附代码)
前端·人工智能·后端·ocr·api·天诺脚本·自动识别文字脚本
金銀銅鐵18 分钟前
[Java] 如何通过 cglib 的 FastClass 调用一个类中的“任意”方法?
java·后端
阿维的博客日记36 分钟前
为什么会增加TreeMap和TreeSet这两类,有什么核心优势吗?可以解决什么核心痛点?
java·treeset·treemap
卷卷说风控41 分钟前
Claude Code 技术架构深扒:Prompt / Context / Harness 三维设计实践
人工智能·架构·prompt
dllxhcjla44 分钟前
黑马头条1
java
宠友信息1 小时前
一套基于uniapp+springboot完整社区系统是如何实现的?友猫社区源码级功能解析
java·spring boot·后端·微服务·微信·uni-app