spring cloud Gateway如何处理跨域问题

 更新时间:2024年04月22日 10:34:14   作者:jia_jia_le94  
这篇文章主要介绍了spring cloud Gateway如何处理跨域问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

spring cloud Gateway处理跨域问题

先简单描述一下架构,项目采用前后端分离的方式,前端是nodejs来搞layui(单页版),后端采用spring cloud Alibaba,网关用的是spring cloud Gateway,然后出现了跨域问题。

一开始百度我以为只需要在Controller上加上@CrossOrigin就能搞定,后来发现出现了很多问题。

问题一

因为后端还有网关,所以如果你没有自定的headers的头信息那么是可以通过 spring cloud Gateway ,但是如果有加自定义Headers,这样就会被 spring cloud Gateway给拦截,说:跨域请求中没有自定的header

错误信息如下

考虑之后觉得应该需要在spring cloud Gateway上添加跨域配置

添加方式有许多种,这里我写出尝试过可以用的两种:

一在application.yml中添加配置

spring:
  application:
    name: nb-web
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedHeaders: "*"
            allowedOrigins: "*"
            allowCredentials: true
            allowedMethods:
              - GET
              - POST
              - DELETE
              - PUT
              - OPTION

第二种再启动类上添加bean:

 /**
     * 配置跨域
     * @return
     */
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // cookie跨域
        config.setAllowCredentials(Boolean.TRUE);
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        // 配置前端js允许访问的自定义响应头
        config.addExposedHeader("Authorization:");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }

这样就能解决自定义headers被拦截和跨域问题,但是这样配置紧接着下一个问题又出来了

问题二

由于跨域配置会进行叠加,举个例子你在服务一种添加了跨域配置,在spring cloud Gateway中也添加了,那这样就会产生headers重复的问题:

前端就会报错,

所以你必须要进行header去重,具体办法如下:在spring cloud Gateway的过滤器中添加过滤配置

spring:
  application:
    name: nb-web
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      default-filters:
        - DedupeResponseHeader=Vary Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
        - DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_FIRST

这样就能把重复的header给去掉了

这样跨域问题基本就能解决了,但是因为我这边需要进行session共享,所以需要给前端传入cookie,那么问题又来了,后端配置的cookie传不出去

原因有两个1:没有加上headers上面加上Access-Control-Allow-Credentials: true,这个可以在

 gateway:
      default-filters:
              - AddResponseHeader=Access-Control-Allow-Credentials,true

添加上,还有一个就是前端的ajax上没有加上:

 , xhrFields: {withCredentials: true}
                , crossDomain: true

这样浏览器就能保存cookie

至此问题就能解决了。在查阅过程中我看到关于跨域配置重复问题是存在bug的,具体内容可以参考:

https://www.jb51.net/program/319980elx.htm

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中的健康检查详解

    SpringBoot中的健康检查详解

    这篇文章主要介绍了SpringBoot中的健康检查详解,健康检查是一种用来确保应用程序和其所依赖的服务的状态正常的机制,在本文中,我们将探讨SpringBoot中的健康检查是什么以及如何使用它来监视应用程序的状态,需要的朋友可以参考下
    2023-07-07
  • Spring中的Sentinel规则持久化解析

    Spring中的Sentinel规则持久化解析

    这篇文章主要介绍了Spring中的Sentinel规则持久化解析,具体内容包括,Sentinel规则推送三种模式介绍,原始模式,拉模式,推模式,并对基于Nacos配置中心控制台实现推送进行详尽介绍,需要的朋友可以参考下
    2023-09-09
  • 解决RestTemplate加@Autowired注入不了的问题

    解决RestTemplate加@Autowired注入不了的问题

    这篇文章主要介绍了解决RestTemplate加@Autowired注入不了的问题,具有很好的参考价值,希望对大家有所帮助。
    2021-08-08
  • Java基础强化训练输入错误即结束进程

    Java基础强化训练输入错误即结束进程

    本文主要介绍了Java编程的基础知识强化应用,文中实例涉及到了许多基础知识,new对象,控制台输入,if语句等。很实用,需要的朋友可以参考下
    2017-09-09
  • Java动态显示当前日期和时间

    Java动态显示当前日期和时间

    这篇文章主要为大家详细介绍了Java动态显示当前日期和时间,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java--Socket通信(客户端服务端双向)

    Java--Socket通信(客户端服务端双向)

    这篇文章主要介绍了Java--Socket通信(客户端服务端双向),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java Swing实现窗体添加背景图片的2种方法详解

    Java Swing实现窗体添加背景图片的2种方法详解

    这篇文章主要介绍了Java Swing实现窗体添加背景图片的2种方法,结合实例形式较为详细的分析了Swing实现窗体添加背景图片的方法,并总结分析了Swing重绘中repaint与updateUI的区别,需要的朋友可以参考下
    2017-11-11
  • Java使用EasyExcel实现百万数据导出的最佳实践指南

    Java使用EasyExcel实现百万数据导出的最佳实践指南

    这篇文章主要为大家详细介绍了Java如何使用EasyExcel实现百万数据导出功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解下
    2026-01-01
  • java开发RocketMQ消息中间件原理基础详解

    java开发RocketMQ消息中间件原理基础详解

    最近 RocketMQ 刚刚上生产环境,闲暇之时在这里做一些分享,主要目的是让初学者能快速上手RocketMQ,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • Mybatis-Plus中updateById方法不能更新空值问题解决

    Mybatis-Plus中updateById方法不能更新空值问题解决

    本文主要介绍了Mybatis-Plus中updateById方法不能更新空值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论