package jnpf.config;
|
|
import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
|
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.core.annotation.Order;
|
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(ReactiveDiscoveryClient discoveryClient, DiscoveryLocatorProperties properties) {
|
return new DiscoveryClientRouteDefinitionLocator(discoveryClient, properties);
|
}
|
|
|
//AuthFilter的默认顺序是-100 跨域配置在认证之前执行
|
// @Bean
|
// @Order(-200)
|
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();
|
}
|
|
}
|