解决网关跨域问题
只需要在服务中添加以下配置代码就可以解决
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
}
或者在需要跨域的controller上使用注解:@CrossOrigin
如果使用的是网关则需要在网关中配置(网关配置完成后则不需要在独立的服务再次配置)
如果有特殊情况既需要在网关中配置,也需要在独立的服务中配置,就需要在网关的配置文件中加以下配置
zuul:
ignoredServices: '*'
sensitiveHeaders: Access-Control-Allow-Origin
ignoredHeaders: Access-Control-Allow-Origin
如果不加这个配置服务就会报如下错误
has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 'http://xxx.com, *', but only one is allowed.
大概意思是 “标头配有多个值,但是只能允许一个”
因为网关访问微服务将response中的Access-Control-Allow-Origin:http://xxx.xxx.com:8080带了过去,就变成了
Access-Control-Allow-Origin:http://xxx.xxx.com:8080,http://xxx.xxx.com:8080
原来用consul做注册中心的时候好像没有出现这个问题,所有服务都配了跨域;然后现在换成nacos就出现这个问题了,搞了好久以为是代码哪里搞得不对,没想到还有这种问题。
现在想再看看怎么找找为啥consul这么配置没有问题?