Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring cloud gateway跨域冲突功能的开发

spring cloud gateway跨域冲突功能的开发

作者头像
星痕
发布于 2020-08-14 08:46:31
发布于 2020-08-14 08:46:31
92900
代码可运行
举报
文章被收录于专栏:JAVA后端开发JAVA后端开发
运行总次数:0
代码可运行

gateway可以实现支持跨域功能,但如果下游也支持跨域,会出现跨域冲突。 如何解决该问题,gateway对外输出相关跨域的httpheader,只要对重复的header去掉即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author starmark
 * @date 2020/5/11  下午9:29
 */
@Slf4j
public class GatewayCorsWebFilter implements WebFilter {
    @Autowired
    private IRouteService routeService;
    private final CorsProcessor processor;

    private static List<String> configHeaderNames = new ArrayList<>();
    static{
        configHeaderNames.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS);
        configHeaderNames.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS);
        configHeaderNames.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS);
        configHeaderNames.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN);
        configHeaderNames.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS);

    }

    public GatewayCorsWebFilter() {
        this.processor = new DefaultCorsProcessor();
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String url = request.getPath().value();
        if (url.contains("webjars") || url.contains("swagger-resources") || url.contains("/v2/api-docs") || url.contains("doc.html") || url.contains("swagger-ui.html") ||
                url.contains(".css") || url.contains(".ico") || url.contains(".js") || url.contains(".png") || url.contains(".jpg")) {
            //如果发现是css或者js文件,直接放行
            return chain.filter(exchange);
        }
        String projectCode = RequestHelper.getRequestProjectCode(request);
        Assert.hasText(projectCode, "工程编码不存在");
        CorsConfiguration corsConfiguration = routeService.getGatewayProjectCorsConfiguration(projectCode);
        boolean isValid = this.processor.process(corsConfiguration, exchange);

        if (!isValid || CorsUtils.isPreFlightRequest(request)) {
            return Mono.empty();
        }
        //解决跨域冲突的问题
        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(exchange.getResponse()) {

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders httpHeaders=    HttpHeaders.writableHttpHeaders(getDelegate().getHeaders());
                dedupe(httpHeaders);
                return httpHeaders;
            }
            void dedupe(HttpHeaders headers) {
                if (headers == null) {
                    return;
                }
                for (String name : configHeaderNames) {
                    dedupe(headers, name.trim());
                }
            }

            private void dedupe(HttpHeaders headers, String name) {
                List<String> values = headers.get(name);
                if (values == null || values.size() <= 1) {
                    return;
                }

                headers.set(name, values.get(values.size() - 1));

            }
        };
        return chain.filter(exchange.mutate().response(decoratedResponse).build());
    }



}

上述是我跨域功能的代码,支持跨域功能及解决跨域冲突功能的问题。 上面有一个梗, exchange.getResponse().getHeaders()的header为只读,需要通过构造响应ServerHttpResponseDecorator 来解决只读的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Cloud Gateway CORS 方案看这篇就够了
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/04/07
5.4K0
Spring Cloud Gateway CORS 方案看这篇就够了
Spring Cloud Gateway CORS方案看这里!
在 SpringCloud 项目中,前后端分离目前很常见,在调试时,会遇到两种情况的跨域:
二哥聊运营工具
2022/07/11
8000
Spring Cloud Gateway CORS方案看这里!
SpringCloud网关Gateway跨域处理,兼容IE
跨域是一个前后端分离开发无法避免的坑,尤其是要兼容ie。之前单项目的时候,都是在后台直接配置cors就好了,或者在nginx中配置,但是微服务要是挨个都配置,代码量大,也不是很优雅。所以我们一般都会在网关配置跨域处理,以下是我的方案,项目亲测可用。
用户2235302
2021/04/22
1.2K0
spring cloud gateway跨域问题
最近,在计划用上spring cloud ,发现在gateway上出现跨域问题. 解决办法如下:
星痕
2019/06/24
1.2K0
SpringCloud GateWay通过过滤器GatewayFilter修改请求或响应内容
Spring Cloud Gateway在有些场景中需要获取request body内容进行参数校验或参数修改,我们通过在GatewayFilter中获取请求内容来获取和修改请求体,下面我们就基于ServerWebExchange来实现:
用户8236825
2023/03/27
3.4K0
​Java | Spring Cloud Gateway 使用和一些实现细节
所谓的API网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等。
双鬼带单
2021/07/20
2.1K0
当Tomcat遇上Netty(续集)
从下往下看,接收请求的时候走的确实是tomcat,然后通过spring cloud gateway的过滤器链,走到了一个叫作 NettyWriteResponseFilter的过滤器。
彤哥
2020/05/28
2.3K0
SpringCloud gateway跨域配置
gateway允许跨域的配置和zuul的不一样,记录一下。 import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator; import org.springframework.cloud.gateway.discovery.DiscoveryLocatorP
天涯泪小武
2019/01/17
5.1K0
Gateway
文章目录[隐藏] 拦截并修改body内容 拦截并修改body内容 @Resource private ObjectMapper objectMapper; private final Lis
用户10325771
2023/03/01
6150
Gateway
聊聊spring cloud gateway的LoadBalancerClientFilter
本文主要研究一下spring cloud gateway的LoadBalancerClientFilter
code4it
2018/09/17
2.6K0
Spring Cloud Gateway环境搭建和配置(二)
除了 YAML 或 Properties 文件外,还可以通过编写 Java 代码的方式进行配置。以下是一个简单的配置示例:
堕落飞鸟
2023/04/10
4020
聊聊spring cloud gateway的PreserveHostHeaderGatewayFilter
本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter
code4it
2018/09/17
1.5K0
Spring Cloud Gateway-自定义GatewayFilter
GatewayFilter的作用域是指定的路由配置,路由配置选项里面需要通过filters指定想要使用的GatewayFilter列表。我们可以通过自定义GatewayFilter,做额外的扩展,实现一些内建GatewayFilter不存在的功能,并且应用到我们的路由配置中。
Throwable
2020/06/23
6.5K0
Spring Cloud Gateway-自定义GatewayFilter
SpringCloud Gateway拦截器遇到的小坑汇总
这是因为Gateway默认使用的是SpringWebflux,解决这个问题需要容重新构造一个request来替换原先的request
Java学习录
2019/12/03
3.1K0
SpringCloud Gateway中你不知道的骚操作
之前的几篇文章中,我们已经提到了如何使用SpringCloud Gateway,那几篇文章的内容已经足够做普通项目使用了,但是如果你想深入了解这个东西,或者说是看完这篇文章你用起来跟普通人就完全不是一个等级的了
Java学习录
2019/12/03
1.9K0
SpringCloud Alibaba实战二十九 | SpringCloud Gateway 请求响应日志
请求响应日志是日常开发调试定位问题的重要手段,在微服务中引入SpringCloud Gateway后我们希望在网关层统一进行日志的收集。
JAVA日知录
2021/04/07
3.1K0
SpringCloud Alibaba实战二十九 | SpringCloud Gateway 请求响应日志
聊聊spring cloud gateway的RedirectToGatewayFilter
本文主要研究下spring cloud gateway的RedirectToGatewayFilter
code4it
2018/09/17
1.4K0
聊聊spring cloud gateway的GatewayFilter
本文主要研究一下spring cloud gateway的GatewayFilter
code4it
2018/09/17
2.7K0
SpringCloud-Gateway解决跨域问题
Spring Cloud Gateway是一个基于Spring Framework的微服务网关,用于构建可扩展的分布式系统。在处理跨域问题时,可以通过配置网关来实现跨域资源共享(CORS)。要解决跨域问题,首先需要在网关的配置文件中添加相关的跨域配置,包括允许访问的域、允许的HTTP方法和其他必要的头信息。通过合理配置这些参数,可以确保在微服务架构中实现安全可靠的跨域请求。使用Spring Cloud Gateway的跨域配置能够有效管理不同服务之间的通信,提高系统的可维护性和安全性。
Damon小智
2024/02/25
2.4K2
SpringCloud-Gateway解决跨域问题
自研网关:多项目的swagger聚合功能
网关一般都会有一个swagger聚合功能,方便于你测试文档接口。 但网上的例子,如https://doc.xiaominfo.com/solution/ui-front-gateway.html#%E6%96%87%E6%A1%A3%E8%81%9A%E5%90%88%E4%B8%9A%E5%8A%A1%E7%BC%96%E7%A0%81. 这些例子都能解决swagger聚合的问题,但问题是他只支持一个项目,但我网关肯定会有多个项目,这个怎么处理呢。 其实这个原理一样,但说起来也是有几个技术难点的.
星痕
2020/09/15
1.3K0
相关推荐
Spring Cloud Gateway CORS 方案看这篇就够了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档