spring cloud gateway请求跨域问题解决方案
这篇文章主要介绍了springcloudgateway请求跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
代码如下
@Configuration
publicclassCorsConfigimplementsGlobalFilter,Ordered{
privatestaticfinalStringALL="*";
privatestaticfinalStringMAX_AGE="18000L";
@Bean
publicRouteDefinitionLocatordiscoveryClientRouteDefinitionLocator(DiscoveryClientdiscoveryClient,
DiscoveryLocatorPropertiesproperties){
returnnewDiscoveryClientRouteDefinitionLocator(discoveryClient,properties);
}
@Bean
publicServerCodecConfigurerserverCodecConfigurer(){
returnnewDefaultServerCodecConfigurer();
}
//添加请求头
@Bean
publicWebFiltercorsFilter(){
return(ServerWebExchangectx,WebFilterChainchain)->{
ServerHttpRequestrequest=ctx.getRequest();
if(!CorsUtils.isCorsRequest(request)){
returnchain.filter(ctx);
}
HttpHeadersrequestHeaders=request.getHeaders();
ServerHttpResponseresponse=ctx.getResponse();
HttpMethodrequestMethod=requestHeaders.getAccessControlRequestMethod();
HttpHeadersheaders=response.getHeaders();
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN,requestHeaders.getOrigin());
headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS,requestHeaders.getAccessControlRequestHeaders());
if(requestMethod!=null){
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS,requestMethod.name());
}
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS,"true");
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS,ALL);
headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE,MAX_AGE);
if(request.getMethod()==HttpMethod.OPTIONS){
response.setStatusCode(HttpStatus.OK);
returnMono.empty();
}
returnchain.filter(ctx);
};
}
//将请求头中有多个值的去掉这是该版本的一个bug
@Override
publicMonofilter(ServerWebExchangeexchange,GatewayFilterChainchain){
returnchain.filter(exchange).then(Mono.defer(()->{
exchange.getResponse().getHeaders().entrySet().stream()
.filter(kv->(kv.getValue()!=null&&kv.getValue().size()>1))
.filter(kv->(kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
||kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)))
.forEach(kv->{
kv.setValue(newArrayList(){{
add(kv.getValue().get(0));
}});
});
returnchain.filter(exchange);
}));
}
@Override
publicintgetOrder(){
//指定此过滤器位于NettyWriteResponseFilter之后
//即待处理完响应体后接着处理响应头
returnNettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER+1;
}
}
此处的spring-cloud-gateway的版本是2.1.3.RELEASE
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。