request.getHeader("Authorization")
返回空值可能有以下几种原因:
1. 请求未携带 Authorization 头
- 前端未正确设置请求头,例如:
// axios 示例
axios.get(url, {
headers: {
'Authorization': 'Bearer your_token_here' // 确保字段名和值正确
}
});
- 使用 Postman 测试时需手动添加
Authorization
头。
2. 大小写问题
- HTTP 头的名称是大小写不敏感的,但某些框架可能对大小写有要求。确保前后端统一使用
Authorization
(首字母大写)。
3. 跨域问题(CORS)
- 如果是跨域请求,浏览器会先发送
OPTIONS
预检请求,此时不会携带自定义头(如Authorization
)。需要后端显式允许该头:// Spring Boot CORS 配置示例
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("Authorization", "Content-Type") // 允许的头部字段
.exposedHeaders("Authorization"); // 暴露给前端的字段
}
}
4. 过滤器/拦截器顺序问题
- Spring Boot中若其他过滤器(如CORS过滤器)提前拦截了请求,可能导致后续拦截器获取不到头部。调整过滤器的执行顺序:
@Bean
public FilterRegistrationBean<YourFilter> yourFilter() {
FilterRegistrationBean<YourFilter> bean = new FilterRegistrationBean<>();
bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置优先级
return bean;
}
5. 代理服务器或网关剥离了头部
- Nginx/Apache等代理可能默认移除下划线开头的头部或自定义头部。检查代理配置:
location / {
proxy_pass http://backend;
proxy_set_header Authorization $http_authorization; # 显式传递头部
}
调试建议
- 打印所有请求头:确认是否真的缺失。
Collections.list(request.getHeaderNames()).forEach(name ->
System.out.println(name + ": " + request.getHeader(name)));
- 检查网络请求:通过浏览器开发者工具(F12)查看请求头是否实际发送。
- 单元测试验证:直接模拟请求测试拦截器逻辑。
如果问题仍未解决,可以提供更多上下文(如前端代码、网络请求截图),我会进一步协助分析!
内容由零声教学AI助手提供,问题来源于学员提问