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

Angular与Spring Boot对接出现Access-Control-Allow-Origin跨域错误如何解决

问题根因

该CORS报错核心原因是:请求携带了自定义的Authorization请求头,会触发浏览器的预检OPTIONS请求,当前后端配置没有正确处理这类预检请求,要么是Spring Security拦截了OPTIONS请求,要么是CORS配置不完整导致跨域头未返回。

解决方案

1. 优先排查Spring Security配置(90%以上是该原因)

因为使用了JWT鉴权必然集成了Spring Security,其默认会拦截所有未放行的OPTIONS预检请求,导致请求根本到不了控制器的@CrossOrigin注解,自然不会返回跨域头。
在Spring Security配置类中添加OPTIONS请求放行规则:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        // 其他原有配置不变,新增下面规则
        .cors().and()
        .authorizeRequests()
        .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
        // 剩下的原有鉴权规则保持不变
        .anyRequest().authenticated()
        // ... 其余原有配置
}

2. 补全控制器@CrossOrigin配置

当前的@CrossOrigin仅配置了允许的源,未显式允许自定义头和请求方法,补全配置如下:

// 请求携带了Authorization自定义头,且预检用OPTIONS方法,必须显式声明允许
@CrossOrigin(origins = "http://localhost:4200", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS})
@RestController
public class Home {
    // 原有接口代码保持不变
}

⚠️ 注意:如果后续需要开启allowCredentials = true(比如传递cookie、鉴权信息),origins不能写*,必须写具体的前端源地址,比如这里的http://localhost:4200。

3. 替换为全局CORS配置(更稳妥,无需每个控制器加注解)

如果不想每个控制器都加@CrossOrigin,直接写全局跨域配置类即可:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:4200")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600); // 预检请求的缓存时间,单位秒,减少重复预检请求
    }
}

前端配置检查

你提供的拦截器和app.module.ts配置没有问题,只要loginService.getToken()能正常返回token即可,无需修改。

内容的提问来源于stack exchange,提问作者Abhijit sarkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:24:07