我与Spring Cloud Camden SR5
和Spring Boot 1.4.4.RELEASE
我的前端是由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调用。
在每次GET
或POST
请求之前,浏览器会发出OPTIONS
请求,其中包含以下标题:
api-test.mydomain.com
https://test.mydomain.com
当我使用Spring Cloud Brixton.SR6
和Spring 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,这似乎很浪费?这是要走的路吗?
答案 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;
}