前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >spring cloud gateway跨域冲突功能的开发

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

作者头像
星痕
发布于 2020-08-14 08:46:31
发布于 2020-08-14 08:46:31
87700
代码可运行
举报
文章被收录于专栏: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方案看这里!
在 SpringCloud 项目中,前后端分离目前很常见,在调试时,会遇到两种情况的跨域:
二哥聊运营工具
2022/07/11
6780
Spring Cloud Gateway CORS方案看这里!
Spring Cloud Gateway CORS 方案看这篇就够了
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/04/07
5K0
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
Spring Cloud Gateway环境搭建和配置(二)
除了 YAML 或 Properties 文件外,还可以通过编写 Java 代码的方式进行配置。以下是一个简单的配置示例:
堕落飞鸟
2023/04/10
3660
Java | Spring Cloud Gateway 是如何工作的
负责转发请求的 NettyRoutingFilter负责将响应回写到原连接的 NettyWriteResponseFilter如何实现负载均衡的总结参考扩展阅读鸣谢
双鬼带单
2021/03/19
2.5K0
Java | Spring Cloud Gateway 是如何工作的
spring cloud gateway 全局过滤器
全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP访问限制等等。
猿天地
2018/10/23
2.3K1
spring cloud gateway 全局过滤器
聊聊spring cloud gateway的RemoveHopByHopHeadersFilter
本文主要研究一下spring cloud gateway的RemoveHopByHopHeadersFilter
code4it
2018/09/17
1.7K0
SpringCloud GateWay通过过滤器GatewayFilter修改请求或响应内容
Spring Cloud Gateway在有些场景中需要获取request body内容进行参数校验或参数修改,我们通过在GatewayFilter中获取请求内容来获取和修改请求体,下面我们就基于ServerWebExchange来实现:
用户8236825
2023/03/27
3K0
聊聊spring cloud gateway的PreserveHostHeaderGatewayFilter
本文主要研究下spring cloud gateway的PreserveHostHeaderGatewayFilter
code4it
2018/09/17
1.5K0
聊聊spring cloud gateway的LoadBalancerClientFilter
本文主要研究一下spring cloud gateway的LoadBalancerClientFilter
code4it
2018/09/17
2.6K0
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
JAVA | Java 解决跨域问题 花式解决跨域问题
我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.
双鬼带单
2020/07/27
12.1K0
JAVA | Java 解决跨域问题 花式解决跨域问题
SpringCloud Gateway中你不知道的骚操作
之前的几篇文章中,我们已经提到了如何使用SpringCloud Gateway,那几篇文章的内容已经足够做普通项目使用了,但是如果你想深入了解这个东西,或者说是看完这篇文章你用起来跟普通人就完全不是一个等级的了
Java学习录
2019/12/03
1.9K0
SpringCloud Alibaba实战二十九 | SpringCloud Gateway 请求响应日志
请求响应日志是日常开发调试定位问题的重要手段,在微服务中引入SpringCloud Gateway后我们希望在网关层统一进行日志的收集。
JAVA日知录
2021/04/07
3K0
SpringCloud Alibaba实战二十九 | SpringCloud Gateway 请求响应日志
记一次springcloud gateway记录日志响应结果乱码问题
一开始感觉是不是中文乱码,但是后面发现有些日志不是中文,也是乱码,而有些记录的日志又能正常显示。于是搜索了一圈,在
lyb-geek
2025/01/19
550
记一次springcloud gateway记录日志响应结果乱码问题
springcloud gateway 自定义协议转化实现
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
张泽旭
2019/12/10
3.3K0
Spring Cloud Gateway-ServerWebExchange核心方法与请求或者响应内容的修改
我们在使用Spring Cloud Gateway的时候,注意到过滤器(包括GatewayFilter、GlobalFilter和过滤器链GatewayFilterChain),都依赖到ServerWebExchange:
Throwable
2020/06/23
13.2K1
Spring Cloud Gateway-ServerWebExchange核心方法与请求或者响应内容的修改
SpringCloudGateway笔记(7)-响应不全
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.5K0
Gateway
文章目录[隐藏] 拦截并修改body内容 拦截并修改body内容 @Resource private ObjectMapper objectMapper; private final Lis
用户10325771
2023/03/01
5620
Gateway
推荐阅读
相关推荐
Spring Cloud Gateway CORS方案看这里!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文