• 解决gateway跨域问题


    只要与当前浏览器访问的url不同(协议,域名,端口号),就会产生跨域。

    1. 配置文件解决,在gateway的配置文件中

    1. spring:
    2. cloud:
    3. gateway:
    4. globalcors:
    5. cors-configurations:
    6. '[/**]':
    7. allowedOrigins: "*"
    8. allowedHeaders: "*"
    9. allowedMethods: "*"
    10. default-filters:
    11. - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST

    注:要加上最下边的配置,不然浏览器还是会报跨域问题,因为浏览器Vary 和 Access-Control-Allow-Origin 两个头重复了两次,其中浏览器对后者有唯一性限制!

    2.配置类

    1. @Component
    2. public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {
    3. private static final Logger logger = LoggerFactory.getLogger(CorsResponseHeaderFilter.class);
    4. private static final String ANY = "*";
    5. @Override
    6. public int getOrder() {
    7. // 指定此过滤器位于NettyWriteResponseFilter之后
    8. // 即待处理完响应体后接着处理响应头
    9. return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
    10. }
    11. @Override
    12. @SuppressWarnings("serial")
    13. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    14. return chain.filter(exchange).then(Mono.fromRunnable(() -> {
    15. exchange.getResponse().getHeaders().entrySet().stream()
    16. .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
    17. .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
    18. || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)
    19. || kv.getKey().equals(HttpHeaders.VARY)))
    20. .forEach(kv ->
    21. {
    22. // Vary只需要去重即可
    23. if(kv.getKey().equals(HttpHeaders.VARY))
    24. kv.setValue(kv.getValue().stream().distinct().collect(Collectors.toList()));
    25. else{
    26. List value = new ArrayList<>();
    27. if(kv.getValue().contains(ANY)){ //如果包含*,则取*
    28. value.add(ANY);
    29. kv.setValue(value);
    30. }else{
    31. value.add(kv.getValue().get(0)); // 否则默认取第一个
    32. kv.setValue(value);
    33. }
    34. }
    35. });
    36. }));
    37. }
    38. }

  • 相关阅读:
    面试突击87:说一下 Spring 事务传播机制?
    【CPP】Introduction
    vue 父子孙页面传值的多种方法
    Spring Cloud Alibaba
    修改Tomcat的默认端口号
    运筹学_1.1.4 线性规划问题-解的概念
    xxxxx
    信息学奥赛一本通:1157:哥德巴赫猜想
    RN操作SQLite数据库的包(sqlite-helper.js)及其使用
    超市结算系统|Springboot+Vue通用超市结算收银系统
  • 原文地址:https://blog.csdn.net/awodewen/article/details/126065480