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

Angular调用Eureka原生API出现CORS跨域错误如何解决?

问题原因

你现有的CORS配置仅对自研Controller生效,Eureka原生接口由依赖内置的Controller处理,默认不在你现有CORS配置的覆盖范围内,若Spring Boot CORS处理优先级低于Eureka相关过滤器,也会导致配置不生效。Postman不会主动校验浏览器同源策略,因此可以正常访问。

解决方案

方案1:配置高优先级全局CORS过滤器(最稳定,适配所有场景)

直接注册优先级最高的CorsFilter,覆盖所有路径包括Eureka原生接口路径:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import java.util.Arrays;

@Configuration
public class GlobalCorsConfig {
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // 允许你的Angular应用地址,生产环境替换为实际部署域名
        config.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
        config.setAllowedMethods(Arrays.asList("*"));
        config.setAllowedHeaders(Arrays.asList("*"));
        // 若需要传递Cookie等凭证开启该配置
        config.setAllowCredentials(true);
        // 预检请求缓存时间,单位秒
        config.setMaxAge(3600L);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 匹配所有路径,覆盖Eureka原生/eureka/**前缀接口
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

方案2:扩展WebMvc CORS配置(适配无Spring Security场景)

如果之前用WebMvcConfigurer做CORS配置,补充Eureka路径的映射规则即可:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 原有自研接口的CORS配置可保留
        registry.addMapping("/someApi/**")
                .allowedOrigins("http://localhost:4200")
                .allowCredentials(true);
        // 新增Eureka原生接口的CORS配置
        registry.addMapping("/eureka/**")
                .allowedOrigins("http://localhost:4200")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

方案3:集成Spring Security场景的补充配置

如果项目引入了Spring Security,需要在安全配置中开启CORS支持,确保CORS过滤器在安全过滤器之前执行:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 开启CORS支持,会自动复用你配置的全局CORS规则
        http.cors()
                .and()
                // 保留你原有安全配置即可
                .csrf().disable()
                .authorizeRequests()
                .anyRequest().authenticated();
    }
}
注意事项
  • 不要仅用@CrossOrigin注解处理该问题,该注解仅能作用于自研Controller类,无法覆盖依赖内置的Eureka接口
  • 生产环境禁止配置allowedOrigins("*"),仅放行实际使用的前端域名,避免安全风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 20:24:09