問題發現
正常情況下,跨域是這樣的:
1. 微服務配置跨域+zuul不配置=有跨域問題
2. 微服務配置+zuul配置=有跨域問題
3. 微服務不配置+zuul不配置=有跨域問題
4. 微服務不配置+zuul配置=ok
然而雲環境中每個服務自己有跨域解決方案,而網關需要做最外層的跨域解決方案.如果服務已有跨域配置網關也有,會出現*多次配置問題。
Access-Control-Allow-Origin:"*,*"
也就是multiple Access-Control-Allow-Origin
!!!所以我們就要,微服務配置+zuul配置=解決跨域問題
zuul的跨域忽略配置
使用ZUUL配置忽略頭部信息
zuul:
#需要忽略的頭部信息,不在傳播到其他服務
sensitive-headers: Access-Control-Allow-Credentials,Access-Control-Allow-Origin,Access-Control-Allow-Methods
ignored-headers: Access-Control-Allow-Credentials,Access-Control-Allow-Origin, Access-Control-Allow-Methods,H-APP-Id,Token,APPToken
微服務應用的跨域配置
@Slf4j @Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); // 允許任何域名使用 corsConfiguration.addAllowedOrigin("*"); // 允許任何頭 corsConfiguration.addAllowedHeader("*"); // 允許任何方法(post、get等) corsConfiguration.addAllowedMethod("*"); return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 對接口配置跨域設置 source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source); } }
如果上面不行再配置文件中再加上這
spring: aop: auto: true proxy-target-class: true application: name: service-zuul cloud: gateway: globalcors: corsConfigurations: '[/**]': allowedHeaders: '*' allowedMethods: '*' allowedOrigins: '*'
只要網關配置就好 , 底下的服務不需要配置。
兩個同時配置還導致了 跨域失敗 適得其反。
關於zuul 的配置 github上有 https://github.com/wangbensen/common-parent.git
