如何在Zuul中使用CORS作为API网关+ AngularJS +微服务

imp*_*zeb 5 java spring netflix-zuul api-gateway

我有一个使用Zuul Netflix作为API网关的应用程序,其体系结构如下:

在此处输入图片说明

该架构运行良好,可以使用浏览器和邮递员从微服务(服务1、2和3)访问不同的REST端点。但是,当我尝试在前端Web应用程序(AngularJS WebApp)中使用它时,在chrome控制台中给我以下错误。

XMLHttpRequest cannot load http://localhost:8080/person/api/all. Response for preflight is invalid (redirect)
Run Code Online (Sandbox Code Playgroud)

如果要设置@CrossOrigin注释,则可以通过自己的地址和端口使用服务。但是,当通过网关访问它时@CrossOrigin,其余端点上没有任何注释将不起作用。

试图在我的安全性配置中创建以下过滤器,但仍然无法正常工作,而是在chrome控制台中出现了以下错误。

@Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
Run Code Online (Sandbox Code Playgroud)

浏览器控制台(Chrome)...

XMLHttpRequest cannot load http://localhost:8080/person/api/all. Redirect from 'http://localhost:80/person/api/all' to 'http://localhost:80' has been blocked by CORS policy: Request requires preflight, which is disallowed to follow cross-origin redirect.
Run Code Online (Sandbox Code Playgroud)

以下是示例AngularJS HTTP请求。

app.controller('loginCtrl', [
    '$scope', '$http', function($scope, $http) {

      $http.get('http://localhost:8080/person/api/all').then(function(data) {
        return console.log(data.data);
      });
]); 
Run Code Online (Sandbox Code Playgroud)

有人知道如何处理吗?到处都是很多教程,但是他们的webapp还是一个Spring Boot应用程序,要么位于api网关中,要么与@EnableZuulProxy注释分开,这不是我想要的。

如果有人可以帮助,请提前感谢。

May*_*ari 1

使用类似的架构,面临类似的问题,我做了以下更改并为我工作:

config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
Run Code Online (Sandbox Code Playgroud)

config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("*", config);
Run Code Online (Sandbox Code Playgroud)

在我的角度 http 请求中我添加了标头,

{'Access-Control-Allow-Origin':'*'}
Run Code Online (Sandbox Code Playgroud)

为我工作。

我试图在最初的情况下只能访问 Zuul 路由映射中映射的第一个 URL。但是将 /** 替换为 * 后能够毫无问题地访问所有映射,Angular 端也同样如此,所有请求都应包含标头。我对这个问题也是新手,也许稍后我会提供更多信息和细节,现在我可以说它对我有用,希望它也对你有用。