这篇文章主要介绍了spring cloud gateway请求跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
代码如下
@configuration public class corsconfig implements globalfilter, ordered { private static final string all = "*"; private static final string max_age = "18000l"; @bean public routedefinitionlocator discoveryclientroutedefinitionlocator(discoveryclient discoveryclient, discoverylocatorproperties properties) { return new discoveryclientroutedefinitionlocator(discoveryclient, properties); } @bean public servercodecconfigurer servercodecconfigurer() { return new defaultservercodecconfigurer(); } //添加请求头 @bean public webfilter corsfilter() { return (serverwebexchange ctx, webfilterchain chain) -> { serverhttprequest request = ctx.getrequest(); if (!corsutils.iscorsrequest(request)) { return chain.filter(ctx); } httpheaders requestheaders = request.getheaders(); serverhttpresponse response = ctx.getresponse(); httpmethod requestmethod = requestheaders.getaccesscontrolrequestmethod(); httpheaders headers = 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); return mono.empty(); } return chain.filter(ctx); }; } //将请求头中有多个值的去掉 这是该版本的一个bug @override public mono<void> filter(serverwebexchange exchange, gatewayfilterchain chain) { return chain.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(new arraylist<string>() {{ add(kv.getvalue().get(0)); }}); }); return chain.filter(exchange); })); } @override public int getorder() { // 指定此过滤器位于nettywriteresponsefilter之后 // 即待处理完响应体后接着处理响应头 return nettywriteresponsefilter.write_response_filter_order + 1; } }
此处的spring-cloud-gateway的版本是2.1.3.release
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
ScrollView和RecyclerView的滑动事件处理
配置JAVA环境+安装Android Studio全过程+踩坑记录
Android P Camera2当SD卡被拔出来自动切换到内部存储
android 多个edittext 判空监听 让Button动态是否可点击
Android开源项目滚轮选择器WheelPicker的基本用法总结
网友评论