SpringCloud添加跨域配置
方案1:通过springcloud的globalcors配置
当然,这里是使用 Markdown 格式描述的 spring.cloud.gateway.globalcors
配置参数含义:
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowed-origin-patterns: "*"
allowed-methods: "*"
allowed-headers: "*"
allow-credentials: true
max-age: 1800
add-to-simple-url-handler-mapping: true
参数含义
cors-configurations
:'[/**]'
:- CORS 配置的匹配模式。
[/**]
表示对所有路径都应用这个 CORS 配置。
- CORS 配置的匹配模式。
allowed-origin-patterns
:"*"
:- 允许所有源进行跨域请求。
*
表示接受所有来源的请求。如果请求带有origin,返回的access-control-allow-origin就是请求的origin的值,也可以指定具体的域名或模式来限制允许的源。
- 允许所有源进行跨域请求。
allowed-methods
:"*"
:- 允许所有的 HTTP 方法(如 GET、POST、PUT、DELETE 等)进行跨域请求。可以指定具体的方法来限制允许的请求方式。
allowed-headers
:"*"
:- 允许所有的请求头。
*
表示接受所有头部信息。可以指定具体的头部来限制允许的请求头。
- 允许所有的请求头。
allow-credentials
:true
:- 允许跨域请求携带凭据(如 Cookies)。设置为
true
表示允许跨域请求带上认证信息。
- 允许跨域请求携带凭据(如 Cookies)。设置为
max-age
:1800
:- 指定预检请求的结果缓存时间(以秒为单位)。
1800
秒(即 30 分钟)表示浏览器可以缓存 CORS 预检请求的结果,减少不必要的预检请求。
- 指定预检请求的结果缓存时间(以秒为单位)。
add-to-simple-url-handler-mapping
:true
:- 表示是否将 CORS 配置添加到 Spring 的
SimpleUrlHandlerMapping
中。设置为true
会确保 CORS 配置应用到所有请求中。
- 表示是否将 CORS 配置添加到 Spring 的
方案2:通过在网关添加全局过滤器处理
@RequiredArgsConstructor
@Component
public class CorsFilter implements WebFilter, Ordered {
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Value("${requestHeaderConfig}")
private String requestHeaderConfig;
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String origin = request.getHeaders().getFirst(HttpHeaders.ORIGIN);
//设置允许跨域的域名
if (origin != null) {
exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, exchange.getRequest().getHeaders().getOrigin());
}
else
{
exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
}
exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS");
exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600");
exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
// 设置允许的自定义请求头
String accessControlRequestHeaders = request.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS);
//请求头中是否存在定义请求头
if (StringUtil.isNotEmpty(accessControlRequestHeaders)) {
for (String header : accessControlRequestHeaders.split(",")) {
exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, header);
}
}
else
{
//不存在则添加默认自定义请求头
exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaderConfig.replaceAll(" ", ""));
}
return chain.filter(exchange);
}
}
总结
跨域处理建议使用方案2,因为方案1没法针对网关里面的过滤器进行处理,还要额外在过滤器的响应头增加跨域兼容
标签:请求,exchange,SpringCloud,getHeaders,add,添加,HttpHeaders,跨域 From: https://blog.csdn.net/u013905123/article/details/140877102