一、@RequestHeader
注解的作用
@RequestHeader
是 Spring MVC 中的注解,用于从 HTTP 请求头中提取特定字段的值。
在你的代码中:
@RequestHeader("Authorization") String token
:从请求头中获取名为Authorization
的字段值,并赋值给token
参数。@RequestHeader("User-Agent") String userAgent
:获取客户端浏览器信息。
二、"Authorization" 字段的来源
Authorization
是一个标准的 HTTP 请求头字段,其定义来自:
HTTP 协议规范(RFC 7235):
- 用于客户端向服务器传递身份验证凭证(如令牌、用户名密码)。
- 格式通常为:
Authorization: <认证类型> <凭证>
。
例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
OAuth 2.0 或 JWT 等认证机制:
- 现代 Web 应用中,
Authorization
字段常被用于传递 JWT(JSON Web Token) 或 OAuth 令牌。
- 现代 Web 应用中,
三、代码中的 "Authorization" 从哪里来?
Authorization
字段的值由客户端(如浏览器、App)在发送请求时添加,常见来源:
前端代码手动设置(如 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
后,通常会:
- 验证 token 有效性(如签名、过期时间)。
- 解析 token 获取用户信息(如用户 ID、角色)。
- 根据用户信息查询数据库,返回用户资料。
示例代码:
@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
则是服务器读取你身份证信息的工具。