@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 注解可以提高代码的可读性和可维护性,尤其是在处理复杂的请求头部逻辑时。
相关推荐
技术无疆8 分钟前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
罗政3 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
Karoku0663 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
架构文摘JGWZ3 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
拾光师4 小时前
spring获取当前request
java·后端·spring
aPurpleBerry4 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏4 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
xujinwei_gingko4 小时前
Spring IOC容器Bean对象管理-Java Config方式
java·spring
2301_789985944 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
IT学长编程4 小时前
计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·毕业设计·springboot·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·教师科研管理系统