JS 访问 ZUUL 后的 Spring REST 服务被 CORS 策略阻止

JS access to Spring REST services behind ZUUL blocked by CORS policy

我正在使用各种 Spring 云框架构建一个小型 service-based 平台。各个组成部分如下:

(是的,这是基于 Manning "Spring Microservices in Action" 中提出的设计)

这在开发中一切正常。但是我最近将所有这些 server-side 东西部署到外部服务器 (运行 docker-compose),我无法再访问服务端点。

通过 JQuery 调用服务端点时出现以下错误:

对“https://my.domain.com/api/resource/123/subresource/456' from origin 'http://localhost:8080”处的 XMLHttpRequest 的访问已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有 'Access-Control-Allow-Origin' header 存在于请求的资源。

我尝试将以下内容添加到 Zuul 服务器(在同一个@EnableZuulProxy Spring 启动应用程序 class 中):

@Bean
public FilterRegsitrationBean corsFilter() {

    UrlBaseCorsConfigurationSource source = 
        new UrlBasedCorsConfigurationSource();

    CorsConfiguration config = new CorsConfiguration();

    config.setAllowCredentials(true);

    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");

    source.registerCorsConfiguration("*", config);

    FilterRegistrationBean<CorsFilter> bean = 
        new FilterRegistrationBean<>(new CorsFilter(source));

    bean.setOrder(Ordered.HIGHEST_PRECEDENCE);

    return bean;
}

这产生了同样的错误。

有什么想法吗?

在Controller中,需要添加@RestController/@Controller注解

@CrossOrigin

像这样:

@Controller
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class HomeController

试试这个。

好的,所以我通过从服务中删除所有 Cors 配置并将其添加到 Zuul 网关来修复它。

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**")
                .allowedMethods("POST", "PUT", "GET", "OPTIONS", "DELETE", "HEAD");
    }
}

它有效,但我不知道为什么我以前的尝试没有(而且我显然讨厌在不了解如何解决问题的情况下修复某些东西)。所以如果有人有任何想法...

干杯