温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring cloud 中怎么利用gateway跨域请求

发布时间:2021-06-16 14:02:49 来源:亿速云 阅读:167 作者:Leah 栏目:编程语言

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;   } }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI