@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 注解可以提高代码的可读性和可维护性,尤其是在处理复杂的请求头部逻辑时。
相关推荐
疯狂踩坑人7 分钟前
【Python版 2026 从零学Langchain 1.x】(二)结构化输出和工具调用
后端·python·langchain
今天_也很困1 小时前
LeetCode热题100-560. 和为 K 的子数组
java·算法·leetcode
在繁华处1 小时前
线程进阶: 无人机自动防空平台开发教程V2
java·无人机
qq_177767371 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
A懿轩A1 小时前
【Java 基础编程】Java 变量与八大基本数据类型详解:从声明到类型转换,零基础也能看懂
java·开发语言·python
m0_740043731 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务
橘子师兄2 小时前
C++AI大模型接入SDK—ChatSDK封装
开发语言·c++·人工智能·后端
@ chen2 小时前
Spring事务 核心知识
java·后端·spring
aithinker2 小时前
使用QQ邮箱收发邮件遇到的坑 有些WIFI不支持ipv6
java
小程故事多_802 小时前
深度搜索Agent架构全解析:从入门到进阶,解锁复杂问题求解密码
人工智能·架构·aigc