美文网首页
spring-cloud-gateway跨域的坑

spring-cloud-gateway跨域的坑

作者: 邓立_全栈UncleLi | 来源:发表于2019-08-19 13:59 被阅读0次

开始的时候找了很多种办法,,包括在gateway服务的application.yml写了的配置都没有生效

一、

spring:
  cloud:
    gateway:      
      globalcors:        
        corsConfigurations:
          '[/**]': 
            allowedOrigins: "*" 
            allowedMethods: "*"

二、

spring:
  cloud:
    gateway:
      routes:
      - id: dedupe_response_header_route
        uri: http://shaguo
        filters:
        - AddResponseHeader=Access-Control-Allow-Origin 

也包括应用服务写全局拦截器(不是gateway服务),也没有用

package com.kfz.config

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class CrossOriginFilter implements GlobalFilter, Ordered {
    private static final String ALL = "*";
    private static final String MAX_AGE = "18000L";


    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, GatewayFilterChain gatewayFilterChain) {
        ServerHttpRequest request = serverWebExchange.getRequest();
//        if (!CorsUtils.isCorsRequest(request)) {
//            return gatewayFilterChain.filter(serverWebExchange);
//        }
        ServerHttpResponse response = serverWebExchange.getResponse();
        HttpHeaders headers = response.getHeaders();
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
        headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, ALL);
        headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
        if (request.getMethod() == HttpMethod.OPTIONS) {
            response.setStatusCode(HttpStatus.OK);
            return Mono.empty();
        }
        return gatewayFilterChain.filter(serverWebExchange);
    }

    @Override
    public int getOrder() {
        return -300;
    }
}

最后在github找到了答案,说需要重新定义配置,否则配置为空,spring-cloud-gateway默认采用webflux拦截,用以下代码写在gateway服务可以关闭默认webflux拦截,开启自定义拦截,如下图的configA、configB


例图

最后成功的方式是在gateway服务加上以下拦截器就好了

package com.kfz.gateway;

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 corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");

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

        return new CorsWebFilter(source);
    }
}

相关文章

  • spring-cloud-gateway跨域的坑

    开始的时候找了很多种办法,,包括在gateway服务的application.yml写了的配置都没有生效如一、 二...

  • 跨域问题剖析

    我们今天聊一下跨域,以下只是个人理解,如有不对,还请指正。希望这篇文章能帮助大家避开跨域的坑或者解决当下的跨域...

  • SpringBoot 实现前后端分离的跨域访问(CORS)

    springBoot小白写博客时遇到了跨域问题,顺便记录一下踩过的坑 springboot解决跨域的几种方式 方式...

  • Nginx 允许子域名通配符跨域

    需求 关于跨域报错的坑 No 'Access-Control-Allow-Origin' header 这段时间折...

  • 跨域踩坑

    跨域问题 在当前域名下访问其它域名下资源时,会出现这个问题。跨域详细信息 错误: 解决方式 需要后端支持。如果你使...

  • 关于防盗链与跨域访问

    关于防盗链与跨域访问 最近用阿里云的时候发现一些防盗链与跨域访问的一些坑,填完坑之后稍微整理一下。 防盗链 防盗链...

  • 深入跨域问题(3) - 利用 JSONP 解决跨域

    深入跨域问题(1) - 初识 CORS 跨域资源共享;深入跨域问题(2) - 利用 CORS 解决跨域深入跨域问题...

  • Web前后端跨域问题处理

    跨域问题有前台跨域(iframe间)和后台跨域。 前台跨域的解决方案可以采用跨域文档通讯(Cross domain...

  • 关于设置env等环境变量的思考

    1、如何处理跨域后台处理跨域前端处理跨域浏览器处理跨域 前端本地处理跨域:代理线上跨域的处理方式:Nginx反向代...

  • 跨域问题详解分析

    参考文档 CORS详解 跨域资源共享 CORS 详解 js中几种实用的跨域方法原理详解 跨域的那些事儿 跨域与跨域...

网友评论

      本文标题:spring-cloud-gateway跨域的坑

      本文链接:https://www.haomeiwen.com/subject/jdfpsctx.html