java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > spring gateway解决跨域问题

spring gateway如何解决跨域问题

作者:it界的哈士奇

这篇文章主要介绍了spring gateway如何解决跨域问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

报错截图

报错意思是请求头中没有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跨域代码)

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

您可能感兴趣的文章:
阅读全文