Angular发送的Authorization请求头为null问题求助
排查步骤
1. 确认浏览器实际发送的请求头
打开浏览器开发者工具的Network面板,定位到目标请求:
- 查看Request Headers区域,确认实际发送的请求中是否存在
Authorization: Bearer xxx - 注意:OPTIONS预检请求不会携带自定义请求头,这是浏览器的正常机制,只需检查后续的实际业务请求(GET/POST等)是否带了头
2. 调整Spring CORS配置细节
你当前配置的allowedOriginPatterns("*")结合allowCredentials(true)在部分浏览器环境下可能存在兼容性问题,建议改为指定具体的前端域名:
@Override public void addCorsMappings(CorsRegistry corsRegistry){ corsRegistry.addMapping("/**") .allowedOriginPatterns("http://localhost:4200") // 替换为你的Angular前端实际地址 .allowedMethods("*") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600L); }
注:exposedHeaders("Authorization")用于让前端读取响应头中的Authorization字段,和请求头无关,可按需移除
3. 修正自定义过滤器的执行逻辑
如果你的自定义过滤器在Spring内置CORS过滤器之前执行,可能会导致请求头未被正确处理。建议在过滤器中先放行OPTIONS预检请求:
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 优先处理OPTIONS预检请求,直接放行 if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); filterChain.doFilter(request, response); return; } // 再处理业务请求的Authorization头解析逻辑 String authHeader = request.getHeader("Authorization"); // ... 你的后续业务代码 }
4. 优化Angular拦截器的请求克隆逻辑
虽然你的拦截器代码逻辑正确,但可以用set替代append避免重复添加请求头的问题,同时增加更明确的日志验证:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const jwtToken = this.sharedService.getJwtToken(); let modifiedReq = req; if(jwtToken){ modifiedReq = req.clone({ headers: req.headers.set('Authorization', `Bearer ${jwtToken}`) }); // 打印验证头信息 console.log('请求头列表:', modifiedReq.headers.keys()); console.log('Authorization值:', modifiedReq.headers.get('Authorization')); } return next.handle(modifiedReq); }
5. 验证Token本身的有效性
把前端打印的JWT Token复制到Postman中测试,确认Token格式正确、无多余空格或换行符,且能被后端正常解析。
内容的提问来源于stack exchange,提问作者user19845343
相关产品推荐
相关产品推荐

