@RequestHeader(“Authorization“) 解析:HTTP 请求头中的 Authorization 字段

一、@RequestHeader 注解的作用

@RequestHeader 是 Spring MVC 中的注解,用于从 HTTP 请求头中提取特定字段的值。

在你的代码中:

  • @RequestHeader("Authorization") String token:从请求头中获取名为 Authorization 的字段值,并赋值给 token 参数。
  • @RequestHeader("User-Agent") String userAgent:获取客户端浏览器信息。

二、"Authorization" 字段的来源

Authorization 是一个标准的 HTTP 请求头字段,其定义来自:

  1. HTTP 协议规范(RFC 7235):

    • 用于客户端向服务器传递身份验证凭证(如令牌、用户名密码)。
    • 格式通常为:Authorization: <认证类型> <凭证>
      例如:

    Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
    Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

  2. OAuth 2.0 或 JWT 等认证机制

    • 现代 Web 应用中,Authorization 字段常被用于传递 JWT(JSON Web Token)OAuth 令牌

三、代码中的 "Authorization" 从哪里来?

Authorization 字段的值由客户端(如浏览器、App)在发送请求时添加,常见来源:

  1. 前端代码手动设置(如 Axios 请求):

    axios.get('/profile', {
    headers: {
    'Authorization': 'Bearer ' + token // token 可能来自登录后的存储
    }
    });

浏览器自动发送(如 Basic Auth):

复制代码
fetch('/profile', {
  headers: {
    'Authorization': 'Basic ' + btoa('username:password')
  }
});

中间件自动处理(如拦截器、过滤器):

复制代码
// 例如,JWT 认证过滤器会从 Cookie 或 LocalStorage 中读取 token,添加到请求头
request.addHeader("Authorization", "Bearer " + token);

四、服务端如何使用这个 token?

在你的 getProfile 方法中,获取到 token 后,通常会:

  1. 验证 token 有效性(如签名、过期时间)。
  2. 解析 token 获取用户信息(如用户 ID、角色)。
  3. 根据用户信息查询数据库,返回用户资料。

示例代码

复制代码
@GetMapping("/profile")
public User getProfile(@RequestHeader("Authorization") String token) {
    // 1. 提取 token(移除 "Bearer " 前缀)
    String jwtToken = token.replace("Bearer ", "");
    
    // 2. 验证 token(实际项目中通常用 JWT 库)
    Claims claims = jwtService.parseToken(jwtToken);
    
    // 3. 获取用户 ID
    Long userId = Long.valueOf(claims.getSubject());
    
    // 4. 查询数据库返回用户信息
    return userRepository.findById(userId).orElseThrow();
}

五、总结

  • Authorization标准的 HTTP 请求头字段,用于传递认证凭证。
  • 它由客户端在请求时添加 ,服务端通过 @RequestHeader 注解获取。
  • 常见用途:JWT 认证、OAuth 2.0 令牌传递、Basic Auth 等。

通俗理解
Authorization 就像你去银行办业务时出示的身份证,告诉服务器 "我是谁",而 @RequestHeader 则是服务器读取你身份证信息的工具。

相关推荐
数据与人工智能律师2 小时前
AI的法治迷宫:技术层、模型层、应用层的法律痛点
大数据·网络·人工智能·云计算·区块链
板鸭〈小号〉4 小时前
Socket网络编程(1)——Echo Server
开发语言·网络·php
24zhgjx-fuhao5 小时前
基于时间的ACL
运维·网络
数据知道6 小时前
Go语言:数据压缩与解压详解
服务器·开发语言·网络·后端·golang·go语言
沐浴露z7 小时前
【深入理解计算机网络05】数据链路层:组帧,差错控制,流量控制与可靠传输
网络·计算机网络·网络编程·408
galaxylove7 小时前
Gartner发布网络弹性指南:将业务影响评估(BIA)嵌入网络弹性策略的核心,重点保护基础设施和关键业务系统
网络·安全·web安全
未来之窗软件服务7 小时前
操作系统应用开发(二十五)RustDesk 502错误—东方仙盟筑基期
网络协议·远程桌面·仙盟创梦ide·东方仙盟·rustdek
山,离天三尺三7 小时前
基于LINUX平台使用C语言实现MQTT协议连接华为云平台(IOT)(网络编程)
linux·c语言·开发语言·网络·物联网·算法·华为云
爱隐身的官人10 小时前
JAVA代码审计总结
java·网络·安全
zwhy031110 小时前
TCP服务器设计思路
linux·服务器·网络