spring gateway如何解决跨域问题
作者:it界的哈士奇
报错截图
报错意思是请求头中没有Access-Control-Allow-Origin
报错分析
但我在网关的配置文件中早就加了跨域的配置了
尝试解决
于是我上网开始查
但是网上的代码要么方法过时报错,要么就向配置文件原因没有起作用,好在我坚持不懈的查询下,把所有有用的信息拼凑成了一个有用的配置方法
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 corsWebFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedMethod("*"); // 允许任何方法(post、get等) config.addAllowedOrigin("*"); // 允许任何域名使用 config.addAllowedHeader("*"); // 允许任何头 config.setAllowCredentials(true); //允许接受cookie UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } }
只要在网关微服务下创建一个配置类把这段代码加进去即可
于是
重新启动
好家伙
再次报错,不过这次不是没有该属性,而是两个!!
那既然这样
我就试试只用代码配置,而注释配置文件配置(因为开始就是配置文件配置无效)
重启走起
依然报重复错误。。。。
最终
最后通过调试发现
请求发往网关后,再次发往其他微服务,而该微服务的controller类上配置了跨域注解
这就导致了两次Access-Control-Allow-Origin被设置了
所有只要把@CrossOrigin注解去了即可
再次重启
总结
除了为啥在配置文件里配置没有生效没搞懂外,其他都能理解
同时这里也解释了一个问题,为啥要专门写一个接口api模块来专门实现微服务间的调用
从这里调用用户微服务来看,网关配置了跨域,那么其他的微服务就不能配置跨域了
那这样微服务如果直接调用就成了跨域了,而api接口模块就很好的解决了这个问题,同时也限制了服务与服务见可调用接口的数量,按需来调用,看来当初听老师话多创建一个api接口模块是有原因的啊
解决睡觉!
补充!!!
后来发现
删除其他微服务的跨域配置在vue连接里可行
但是如果在html页面直接发送axios请求后台数据
请求网关可行,但是请求完了网关,网关会进行一次页面转发
这就使得第二次请求没有Access-Control-Allow-Origin报跨域请求
如果将后台服务的跨域配置重新写上
又会出现Access-Control-Allow-Origin重复的问题。。。
好在查到了大佬的帖子,可以在配置文件找那个添加一段过滤配置
解决重复跨域问题,进行header去重
spring: cloud: gateway: default-filters: - DedupeResponseHeader=Vary Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_FIRST
至于帖子中写的解决cookie跨域问题,,,我试了,似乎没有效果,一样报跨域错误,于是我在配置类尝试着找相关方法,还真有!
只需要在配置类里添加以一段设置cookie允许跨域的配置(已经在上面的配置方法里补充了cookie跨域代码)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。