当前位置: 首页 > news >正文

跨域问题以及经过网关二次转发重复跨域

1跨域问题解决

package com.win.credit.point.gateway.config;

import java.time.Duration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;
/**
 */
@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");;
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.setMaxAge(Duration.ofHours(24));//options重复请求cache优化
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

2有网关一层,网关会转发一次,重复跨域

package com.win.credit.point.gateway.filter;
import java.util.Arrays;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;
/**
 * 重复跨域,去重
 */
@Component("corsResponseHeaderFilter")
public class ResponseCorsHeaderFilter implements GlobalFilter, Ordered {

    private static final Logger logger = LoggerFactory.getLogger(ResponseCorsHeaderFilter.class);
    
    @Override
    public int getOrder() {
        // 指定此过滤器位于NettyWriteResponseFilter之后
        // 即待处理完响应体后接着处理响应头
        return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1000;
    }

    /**
     * Process the Web request and (optionally) delegate to the next {@code WebFilter}
     * through the given {@link GatewayFilterChain}.
     *
     * @param exchange the current server exchange
     * @param chain    provides a way to delegate to the next filter
     * @return {@code Mono<Void>} to indicate when request processing is complete
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            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(Arrays.asList(kv.getValue().get(1)));
            });
        }));
    }
}
 

本文只给解决方式,仅供参考。

相关文章:

  • 自动控制原理9.2---线性系统的可控性与可观测性(上)
  • DOM事件流+阻止冒泡事件+dom包含
  • ZYNQ之GPIO机制
  • 第二章:Qt下载与安装 之 2.2 Qt安装
  • 一种基于堆的链式优先队列实现(使用golang)
  • 【笔记】文献阅读[YOLOV2]-YOLO9000: Better, Faster, Stronger
  • 【JVM基础】方法区
  • Delphi的函数指针传递和调用
  • Java实现简单图书操作系统思路讲解
  • SpringBoot MVC使用Gson,序列化LocalDate,LocalDateTime
  • 戴尔G3-3579改固态散热
  • C3P0和Druid数据库连接池的使用
  • 2022中国消费者智能网联汽车数据安全和个人隐私意识与顾虑调查报告
  • Java 大文件分片上传
  • Redis未授权访问漏洞
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 230. Kth Smallest Element in a BST
  • Angular 响应式表单之下拉框
  • avalon2.2的VM生成过程
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Js基础知识(一) - 变量
  • js面向对象
  • node学习系列之简单文件上传
  • PHP 7 修改了什么呢 -- 2
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Vue2.0 实现互斥
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 简单数学运算程序(不定期更新)
  • 开发基于以太坊智能合约的DApp
  • 入手阿里云新服务器的部署NODE
  • 译米田引理
  • 自定义函数
  • 《码出高效》学习笔记与书中错误记录
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​一些不规范的GTID使用场景
  • (1)(1.13) SiK无线电高级配置(五)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)正点原子I.MX6ULL u-boot移植
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (南京观海微电子)——COF介绍
  • (一)Java算法:二分查找
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ******之网络***——物理***
  • .NET CORE Aws S3 使用
  • .NET Core 中的路径问题
  • .Net Core和.Net Standard直观理解
  • .NET 依赖注入和配置系统
  • .NET业务框架的构建
  • .NET值类型变量“活”在哪?
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题