首页 > 其他分享 >SpringCloud添加跨域配置

SpringCloud添加跨域配置

时间:2024-08-02 22:53:47浏览次数:13  
标签:请求 exchange SpringCloud getHeaders add 添加 HttpHeaders 跨域

SpringCloud添加跨域配置

方案1:通过springcloud的globalcors配置

当然,这里是使用 Markdown 格式描述的 spring.cloud.gateway.globalcors 配置参数含义:

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowed-origin-patterns: "*"
            allowed-methods: "*"
            allowed-headers: "*"
            allow-credentials: true
            max-age: 1800
        add-to-simple-url-handler-mapping: true

参数含义

  • cors-configurations:
    • '[/**]':
      • CORS 配置的匹配模式。[/**] 表示对所有路径都应用这个 CORS 配置。
    • allowed-origin-patterns:
      • "*":
        • 允许所有源进行跨域请求。* 表示接受所有来源的请求。如果请求带有origin,返回的access-control-allow-origin就是请求的origin的值,也可以指定具体的域名或模式来限制允许的源。
    • allowed-methods:
      • "*":
        • 允许所有的 HTTP 方法(如 GET、POST、PUT、DELETE 等)进行跨域请求。可以指定具体的方法来限制允许的请求方式。
    • allowed-headers:
      • "*":
        • 允许所有的请求头。* 表示接受所有头部信息。可以指定具体的头部来限制允许的请求头。
    • allow-credentials:
      • true:
        • 允许跨域请求携带凭据(如 Cookies)。设置为 true 表示允许跨域请求带上认证信息。
    • max-age:
      • 1800:
        • 指定预检请求的结果缓存时间(以秒为单位)。1800 秒(即 30 分钟)表示浏览器可以缓存 CORS 预检请求的结果,减少不必要的预检请求。
  • add-to-simple-url-handler-mapping:
    • true:
      • 表示是否将 CORS 配置添加到 Spring 的 SimpleUrlHandlerMapping 中。设置为 true 会确保 CORS 配置应用到所有请求中。

方案2:通过在网关添加全局过滤器处理


@RequiredArgsConstructor
@Component
public class CorsFilter implements WebFilter, Ordered {
    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }

    @Value("${requestHeaderConfig}")
    private String requestHeaderConfig;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String origin = request.getHeaders().getFirst(HttpHeaders.ORIGIN);
        //设置允许跨域的域名
        if (origin != null) {
            exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, exchange.getRequest().getHeaders().getOrigin());
        }
        else
        {
            exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
        }
        exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS");
        exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600");
        exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
        // 设置允许的自定义请求头
        String accessControlRequestHeaders = request.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS);
        //请求头中是否存在定义请求头
        if (StringUtil.isNotEmpty(accessControlRequestHeaders)) {
            for (String header : accessControlRequestHeaders.split(",")) {
                exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, header);
            }
        }
        else
        {
            //不存在则添加默认自定义请求头
            exchange.getResponse().getHeaders().add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaderConfig.replaceAll(" ", ""));
        }
        return chain.filter(exchange);
    }
}

总结

跨域处理建议使用方案2,因为方案1没法针对网关里面的过滤器进行处理,还要额外在过滤器的响应头增加跨域兼容

标签:请求,exchange,SpringCloud,getHeaders,add,添加,HttpHeaders,跨域
From: https://blog.csdn.net/u013905123/article/details/140877102

相关文章

  • 在OpenWrt中添加package
    AddnewpackagetoOpenwrt1.PreparingyourOpenWrtbuildsystemforuse2.Creatingasimple"Hello,world!"application3.Creatintapackagefromyourapplication4.InculdingyourpackagefeedintoOpenWrtbuildsystem5.Building,deployin......
  • SpringCloud入门学习笔记(四)
    Sentinel篇 SpringCloud入门学习笔记(一)-CSDN博客SpringCloud入门学习笔记(二)-CSDN博客SpringCloud入门学习笔记(三)-CSDN博客前言 在互联网应用过程中,有很多的高并发访问场景,类似于双十一这种活动,特点是访问量剧增,访问量超出系统所能处理的最大并发数。 如果没有保护机......
  • SpringCloud入门学习笔记(三)
    Nacos篇SpringCloud入门学习笔记(二)-CSDN博客SpringCloud入门学习笔记(一)-CSDN博客前言  上篇中提到服务消费者要去调用多个服务提供者构成的集群,此时需要一个三方软件来同步更新提供者的地址信息,同时供服务消费者来此处访问地址,为了解决这类问题,就需要引入服务注册组件(功......
  • SpringCloud EasyConfig介绍与使用
    maven引入方式<dependency><groupId>icu.liufuqiang</groupId><artifactId>spring-cloud-easy-config-starer</artifactId><version>0.1.0</version></dependency>仓库地址https://gitee.com/LiuFqiang/spring-c......
  • SpringCloud使用Sentinel,Sentinel持久化,Sentinel使用nacos持久化
    Sentinel官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html下载Sentinel:https://github.com/alibaba/Sentinel/releasessentinel控制台文档:https://sentinelguard.io/zh-cn/docs/dashboard.html参考:https://www.cnblogs.com/ralgo/p/14152390.html启动Sentinel命令:j......
  • java 后端 控制跨域问题
     @ComponentpublicclassUserLoginInterceptorimplementsHandlerInterceptor{ privatestaticfinalLoggerlogger=LoggerFactory.getLogger(UserLoginInterceptor.class); @Value("${zyplayer.doc.manage.originDomainRegex:}") privateStringorig......
  • 将 cookie 数据添加到 requests.urlretrieve 中
    我正在尝试从受密码保护的网站下载.torrent文件。我已经成功地使用cookie访问该网站,如下所示:cookies={'uid':'232323','pass':'31321231jh12j3hj213hj213hk','__cfduid':'kj123kj21kj31k23jkl21j321j3kl213kl21j3'}......
  • Animate软件基础:在时间轴中添加或插入帧
    FlashASer:AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084FlashASer:实用的各种AdobeAnimate软件教程https://zhuanlan.zhihu.com/p/675680471FlashASer:Animate教程及作品源文件https://zhuanlan.zhihu.com/p/677437436FlashASer:Animate2022零......
  • Java/SpringCloud/RabbitMq/无感实现消息携带用户信息 --- 逻辑讲解、代码实现、图形
    一、需求:依据黑马商城hmall为例,用户下单创建订单后,交易服务trade-service向交换机topic发送消息,交换机topic路由到队列,购物车服务cart-service监听此队列,实现自动清空购物车。改造下单功能,将基于OpenFeign的清理购物车同步调用,改为基于RabbitMQ的异步通知:定义t......
  • platformio 添加github的库
    platformio添加github的库在PlatformIO中添加GitHub上的库,你需要在项目的platformio.ini文件中使用库的GitHubURL。以下是添加库的步骤:打开你的PlatformIO项目的platformio.ini文件。在[env:default]部分或者特定的环境部分下,使用lib_deps指令添加GitHub上的库......