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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。