注意:关于跨域,不同的跨域类型需要不同的配置
一、相同的二级域名之间的跨域
最近在处理跨域问题的时候,发现在微服务中配置允许跨域配置,发现也无济于事了。排查发现,之前之所以这样配置能够生效,是因为都是相同的二级域名之间的跨域,比如:service.csdn.com访问api.csdn.com,这种相同的二级域名配置跨域,可以直接在我们的微服务中添加下列配置进行解决
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(false).maxAge(3600);
}
}
二、不同的二级域名之间的跨域
什么是不同的二级域名?比如从service.csdn.com站点访问 api.abcd.com的时候,这时候在我们的为服务器中配置上面的配置,你就会发现无济于事,还是会抛出跨域请求异常,这个时候,就需要在我们的springcloud gateway网关的服务里去配置跨域了,具体配置如下:
spring:
cloud:
gateway:
#这个是解决和其他微服务配置的跨域冲突的
default-filters:
- DedupeResponseHeader=Vary Access-Control-Allow-Credentials Access-Control-Allow-Origin
- DedupeResponseHeader=Access-Control-Allow-Origin
globalcors:
cors-configurations:
'[/**]':
# 允许跨域的源(网站域名/ip),设置*为全部
# 允许跨域请求里的head字段,设置*为全部
# 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
allow-credentials: true
# allowedOriginPatterns: "*"
#这里是配置允许跨域过来的网站,建议用这种
allowed-origins:
- "http://service.csdn.com"
allowed-headers: "*"
allowed-methods:
- OPTIONS
- GET
- POST
- DELETE
- PUT
- PATCH
max-age: 3600
上述的两种配置,基本就能够解决大多数的跨域问题了。如果在网关里配置跨域了,其实微服务的跨域就可以取消不用了。结合自己的实际情况,选择跨域配置,才是最好的选择。