使用Spring Boot&amp ;;的CORS预检请求的Host vs Origin标头。 Zuul

时间:2017-02-17 07:42:01

标签: javascript java spring-boot cors spring-cloud

我与Spring Cloud Camden SR5Spring Boot 1.4.4.RELEASE

一起使用Zuul

我的前端是由React.js服务器提供的Node Express应用程序。我的API落后于zuul。

可以通过https://test.mydomain.com和API(Zuul)通过https://api-test.mydomain.com

访问前端

Zuul我有一个CORS过滤器来设置CORS标头(正确吗?):

if(corsAllowedOrigin.contains(host)){
        log.debug("{} is allowed", origin);
        response.setHeader("Access-Control-Allow-Origin", origin);
    }
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", allowHeaders);
response.setHeader("Access-Control-Expose-Headers", exposeHeaders);
chain.doFilter(req, res);

使用React.js我使用Fetch对API进行HTTP调用。

在每次GETPOST请求之前,浏览器会发出OPTIONS请求,其中包含以下标题:

  • 主持人:api-test.mydomain.com
  • 原产地:https://test.mydomain.com

当我使用Spring Cloud Brixton.SR6Spring Boot 1.3.4.RELEASE时效果很好。

但是我现在收到403,错误消息为Invalid CORS request

使用REST客户端我注意到,如果我更改标题以便Host == Origin,那么我将获得200 OK

我可以找到CORS spec

  

除了检查Origin头之外,强烈建议资源作者检查Host头。也就是说,确保该标头提供的主机名与资源所在的服务器的主机名匹配。这将提供针对DNS重新绑定攻击的保护。

这就是我现在获得403的原因吗?如何在不失败OPTIONS请求的情况下在不同的主机上运行我的API?

更新

如果我将CORS过滤器添加到边缘服务后面的每个单独服务,我似乎可以解决问题。也就是说,如果我确保每个服务都填充Access-Control-Allow-Origin标题。

在更新之前,我的边缘服务(Zuul)上只有一个CORS过滤器,我认为这是要走的路。当然,如果我需要为每项服务配置CORS,这似乎很浪费?这是要走的路吗?

1 个答案:

答案 0 :(得分:0)

出于某种原因,如果我使用Spring提供的CORS过滤器(org.springframework.web.filter.CorsFilter.CorsFilter),它似乎有效:

@Bean
public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    bean.setOrder(0);
    return bean;
}