Gateway admite dominios cruzados

1. Dominio cruzado de Zuul: método de configuración

aplicación.yml

zuul:
	sensitive-headers: Access-Control-Allow-Origin
	ignored-headers:Access-Control-Allow-Origin,H-APP-Id,Token,APPToken

Dos, puerta de enlace entre dominios: método de filtro

Spring Cloud Gateway 2.x NettyRoutingFilter tiene un error y configurará repetidamente dominios cruzados, por lo que el dominio cruzado repetido debe cancelarse inmediatamente después de NettyRoutingFilter

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.ArrayList;

public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {
    
    
    @Override
    public int getOrder() {
    
    
        // 指定此过滤器位于NettyWriteResponseFilter之后
        // 即待处理完响应体后接着处理响应头
        return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        return chain.filter(exchange).then(Mono.defer(() -> {
    
    
            exchange.getResponse().getHeaders().entrySet().stream()
                    .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
                    .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) ||
                            kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)))
                    .forEach(kv -> {
    
    
                        kv.setValue(new ArrayList<String>() {
    
    {
    
    
                            add(kv.getValue().get(0));
                        }});
                    });

            return chain.filter(exchange);
        }));
    }
}

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.DefaultCorsProcessor;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.util.pattern.PathPatternParser;

@Configuration
public class CorsConfig {
    
    
    @Bean
    public CorsResponseHeaderFilter corsResponseHeaderFilter() {
    
    
        return new CorsResponseHeaderFilter();
    }

    @Bean
    public CorsWebFilter corsFilter() {
    
    
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", buildCorsConfiguration());

        CorsWebFilter corsWebFilter = new CorsWebFilter(source, new DefaultCorsProcessor() {
    
    
            @Override
            protected boolean handleInternal(ServerWebExchange exchange, CorsConfiguration config,
                                             boolean preFlightRequest) {
    
    
                return super.handleInternal(exchange, config, preFlightRequest);
            }
        });

        return corsWebFilter;
    }

    private CorsConfiguration buildCorsConfiguration() {
    
    
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.setMaxAge(7200L);
        corsConfiguration.setAllowCredentials(true);
        return corsConfiguration;
    }
}

Notas complementarias:
1. El dominio cruzado se usa cuando el front-end usa el método de solicitud de opciones para las solicitudes de verificación de URL. 2.
La idea de procesamiento del lado del servidor es devolver si se permite el dominio cruzado, el método de solicitud permitido y el La interfaz comercial normal se puede llamar solo después de obtener la información de encabezado entre dominios permitidos en el método de opciones. 3. Bajo el microservicio, la
capa de puerta de enlace debe configurarse para Permitir dominios cruzados y la capa empresarial no configura dominios cruzados; de lo contrario, el front-end indicará que no es compatible con dominios cruzados o configurará repetidamente problemas de dominios cruzados.

Supongo que te gusta

Origin blog.csdn.net/qq_21033663/article/details/105902426
Recomendado
Clasificación