likes
comments
collection
share

RequestHeaderMethodArgumentResolver 认证信息特定参数解析案例

作者站长头像
站长
· 阅读数 26

RequestHeaderMethodArgumentResolver用于将 HTTP 请求头绑定到控制器方法参数的参数解析器。它允许方法参数直接接收特定的请求头值。

类结构设计

RequestHeaderMethodArgumentResolver 认证信息特定参数解析案例

业务案例:

开发一个需要用户认证信息的 Web 应用程序。程序中的每个请求都需要包含一个 Authorization 头,用于验证用户身份。使用 RequestHeaderMethodArgumentResolver,你可以轻松地将这个请求头的值注入到控制器方法的参数中。

1. 控制器方法使用 @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 AuthController {

    @GetMapping("/user")
    public String getUserInfo(@RequestHeader("Authorization") String authToken) {
        // 使用 authToken 验证用户身份
        // 如果验证成功,返回用户信息
        // ...
        return "User info for authenticated user";
    }
}

在这个例子中,@RequestHeader("Authorization") 注解用于将 Authorization 请求头的值注入到 authToken 参数中。

2. 客户端请求:

客户端通过发送包含 Authorization 头的 HTTP 请求来访问受保护的资源:

GET /user
Authorization: Bearer your_access_token_here

核心代码分析:

RequestHeaderMethodArgumentResolver 类实现了 HandlerMethodArgumentResolver 接口,用于解析 HTTP 请求头到控制器方法的参数。以下是解析器的核心组件和它们的功能:

  1. 支持参数判断

    • supportsParameter 方法检查方法参数是否有 @RequestHeader 注解。
  2. 参数解析

    • resolveArgument 方法根据 @RequestHeader 注解的值从请求中提取对应的头信息。
  3. 处理请求头

    • 使用 NativeWebRequest 获取当前请求的头信息。

参数解析代码 :

import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.context.request.NativeWebRequest;

public class RequestHeaderMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 检查参数是否有 @RequestHeader 注解
        return parameter.hasParameterAnnotation(RequestHeader.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, NativeWebRequest webRequest) throws Exception {
        // 获取 @RequestHeader 注解
        RequestHeader headerAnno = parameter.getParameterAnnotation(RequestHeader.class);
        // 获取请求头的名称
        String headerName = headerAnno.value();
        // 从请求中获取头的值
        String headerValue = webRequest.getHeader(headerName);
        // 返回请求头的值
        return headerValue;
    }
}

总结:

  • RequestHeaderMethodArgumentResolver 允许开发者直接将 HTTP 请求头的值注入到控制器方法的参数中,简化了请求头的处理。
  • 它提供了一种灵活的方式来访问请求头,尤其是在需要根据请求头进行业务逻辑处理时。
转载自:https://juejin.cn/post/7384271428147183657
评论
请登录