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整合RabbitMQ实现发送验证码的示例代码
这篇文章主要介绍了Springboot整合RabbitMQ实现发送验证码的功能,基于AMQP协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开 发中应用非常广泛,需要的朋友可以参考下2022-02-02浅谈Java中SimpleDateFormat 多线程不安全原因
SimpleDateFormat是Java中用于日期时间格式化的一个类,本文主要介绍了浅谈Java中SimpleDateFormat 多线程不安全原因,感兴趣的可以了解一下2024-01-01IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能
这篇文章主要介绍了IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-04-04Spring Boot利用JSR303实现参数验证的方法实例
这篇文章主要给大家介绍了关于Spring Boot利用JSR303实现参数验证的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧2020-05-05
最新评论