spring cloud gateway请求跨域问题解决方案
程序员文章站
2024-01-28 14:06:40
这篇文章主要介绍了spring cloud gateway请求跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
代码...
这篇文章主要介绍了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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 为什么市面上程序开发人员偏少?
推荐阅读
-
spring cloud gateway请求跨域问题解决方案
-
Spring MVC中处理ajax请求的跨域问题与注意事项详解
-
Spring Security使用中Preflight请求和跨域问题详解
-
spring cloud实现前端跨域问题的解决方案
-
spring cloud实现前端跨域问题的解决方案
-
Ajax请求WebService跨域问题的解决方案
-
spring cloud gateway跨域问题
-
spring boot 跨域问题 与一个简单的跨域请求测试
-
Ajax请求跨域问题解决方案分析
-
Spring Cloud Gateway 2.x 跨域出现“Multiple CORS header”的问题解决