content: package jnpf.config;
  
  import org.springframework.cloud.client.discovery.DiscoveryClient;
  import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator;
  import org.springframework.cloud.gateway.discovery.DiscoveryLocatorProperties;
  import org.springframework.cloud.gateway.route.RouteDefinitionLocator;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.http.HttpHeaders;
  import org.springframework.http.HttpMethod;
  import org.springframework.http.HttpStatus;
  import org.springframework.http.codec.ServerCodecConfigurer;
  import org.springframework.http.codec.support.DefaultServerCodecConfigurer;
  import org.springframework.http.server.reactive.ServerHttpRequest;
  import org.springframework.http.server.reactive.ServerHttpResponse;
  import org.springframework.web.cors.reactive.CorsUtils;
  import org.springframework.web.server.WebFilter;
  import reactor.core.publisher.Mono;
  
  /**
   * 跨域问题
   *
   * @author JNPF开发平台组
   * @version V3.1.0
   * @copyright 引迈信息技术有限公司（https://www.jnpfsoft.com）
   * @date 2021-03-24
   */
  @Configuration
  public class CorsConfig {
      private static final String ALL = "*";
      private static final String MAX_AGE = "18000L";
  
      @Bean
      public RouteDefinitionLocator discoveryClientRouteDefinitionLocator(DiscoveryClient discoveryClient, DiscoveryLocatorProperties properties) {
          return new DiscoveryClientRouteDefinitionLocator(discoveryClient, properties);
      }
  
  
      @Bean
      public WebFilter corsFilter() {
          return (ctx, chain) -> {
              ServerHttpRequest request = ctx.getRequest();
              if (!CorsUtils.isCorsRequest(request)) {
                  return chain.filter(ctx);
              }
              HttpHeaders requestHeaders = request.getHeaders();
              ServerHttpResponse response = ctx.getResponse();
              HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
              HttpHeaders headers = response.getHeaders();
              headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
              headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders.getAccessControlRequestHeaders());
              if (requestMethod != null) {
                  headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
              }
              headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
              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 chain.filter(ctx);
          };
      }
  
      @Bean
      public ServerCodecConfigurer serverCodecConfigurer() {
          return new DefaultServerCodecConfigurer();
      }
  
  }
  