@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 注解可以提高代码的可读性和可维护性,尤其是在处理复杂的请求头部逻辑时。
相关推荐
盖世英雄酱581365 分钟前
java 深度调试【第一章:堆栈分析】
java·后端
lastHertz22 分钟前
Golang 项目中使用 Swagger
开发语言·后端·golang
渣哥23 分钟前
面试高频:Spring 事务传播行为的核心价值是什么?
javascript·后端·面试
调试人生的显微镜28 分钟前
iOS 代上架实战指南,从账号管理到使用 开心上架 上传IPA的完整流程
后端
本就一无所有 何惧重新开始32 分钟前
Redis技术应用
java·数据库·spring boot·redis·后端·缓存
低音钢琴1 小时前
【SpringBoot从初学者到专家的成长11】Spring Boot中的application.properties与application.yml详解
java·spring boot·后端
越千年1 小时前
用Go实现类似WinGet风格彩色进度条
后端
蓝色汪洋1 小时前
string字符集
java·开发语言
卿言卿语1 小时前
CC1-二叉树的最小深度
java·数据结构·算法·leetcode·职场和发展
淳朴小学生1 小时前
静态代理和动态代理
后端