You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring+Angular添加@CrossOrigin后,带Authorization Header的请求仍遭CORS拦截

解决方案

针对你遇到的CORS报错+JWT解析异常问题,核心原因是浏览器预请求(OPTIONS)未被后端正确放行,再加上带Authorization头时CORS配置有特殊要求,按以下步骤排查修复:

1. 优先放行OPTIONS预请求

浏览器发送带自定义头(比如Authorization)的请求前,会先发OPTIONS预请求确认权限,但这个预请求里不会携带Authorization头。如果你的JWT拦截器/过滤器没放过OPTIONS请求,后端会直接拦截它,导致响应里没有Access-Control-Allow-Origin等CORS头,浏览器就会抛出拦截错误。

修改你的JWT拦截器代码,添加OPTIONS请求的放行逻辑:

public class JwtInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 放行OPTIONS预请求,不做JWT校验
        if (HttpMethod.OPTIONS.name().equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return true;
        }
        // 后续正常的JWT校验逻辑
        String token = resolveToken(request);
        // ...
    }
}

2. 修正CORS配置(禁用*指定origin)

当请求携带Authorization头时,浏览器不允许Access-Control-Allow-Origin设为*,必须指定具体的前端域名。建议用全局CORS配置替代控制器上的@CrossOrigin,避免遗漏接口:

@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                // 指定前端地址,不要用*
                .allowedOrigins("http://localhost:4200")
                // 允许所有请求头
                .allowedHeaders("*")
                // 暴露需要前端读取的响应头
                .exposedHeaders("Authorization")
                // 允许所有HTTP方法(包含OPTIONS)
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                // 允许携带凭证(比如Authorization头)
                .allowCredentials(true);
    }
}

配置完成后可以移除控制器上的@CrossOrigin注解,避免配置冲突。

3. 完善后端resolveToken方法逻辑

确保你的resolveToken方法能处理请求头为空的情况(比如OPTIONS请求时),避免因token为空抛出异常导致响应缺失CORS头:

private String resolveToken(HttpServletRequest request) {
    String bearerToken = request.getHeader("Authorization");
    // 校验格式,避免空指针
    if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
        return bearerToken.substring(7);
    }
    // 无token时返回null,不要抛出异常
    return null;
}

4. Angular端补充有效性校验

虽然你确认请求头不为空,但可以加一层token存在性判断,避免无效请求:

getSensors(){
  const token = localStorage.getItem("token");
  if (!token) {
    console.error("未获取到登录令牌");
    return;
  }
  const headers = new HttpHeaders({
    'Authorization': `Bearer ${token}`
  });
  this.http.get("http://localhost:8080/sensors", { headers })
    .subscribe(
      res => console.log(res),
      err => console.error("请求失败:", err)
    );
}

完成以上步骤后重启前后端,即可解决CORS错误和token解析异常问题。

内容的提问来源于stack exchange,提问作者Matvey Androsyuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:25:57