优化 CorsFilter 的实现
parent
48b8a5dc78
commit
fc113b640b
|
@ -2,58 +2,10 @@ package cn.iocoder.yudao.gateway;
|
||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.context.ConfigurableApplicationContext;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.core.env.Environment;
|
|
||||||
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.web.cors.reactive.CorsUtils;
|
|
||||||
import org.springframework.web.server.ServerWebExchange;
|
|
||||||
import org.springframework.web.server.WebFilter;
|
|
||||||
import org.springframework.web.server.WebFilterChain;
|
|
||||||
import reactor.core.publisher.Mono;
|
|
||||||
|
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
public class GatewayServerApplication {
|
public class GatewayServerApplication {
|
||||||
|
|
||||||
// ----------------------------- 解决跨域 Begin -----------------------------
|
|
||||||
|
|
||||||
private static final String ALL = "*";
|
|
||||||
private static final String MAX_AGE = "3600L";
|
|
||||||
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public WebFilter corsFilter() {
|
|
||||||
return (ServerWebExchange ctx, WebFilterChain 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);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------- 解决跨域 End -----------------------------
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// 启动 Spring Boot 应用
|
// 启动 Spring Boot 应用
|
||||||
SpringApplication.run(GatewayServerApplication.class, args);
|
SpringApplication.run(GatewayServerApplication.class, args);
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
package cn.iocoder.yudao.gateway.filter.cors;
|
||||||
|
|
||||||
|
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.cors.reactive.CorsUtils;
|
||||||
|
import org.springframework.web.server.ServerWebExchange;
|
||||||
|
import org.springframework.web.server.WebFilter;
|
||||||
|
import org.springframework.web.server.WebFilterChain;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跨域 Filter
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class CorsFilter implements WebFilter {
|
||||||
|
|
||||||
|
private static final String ALL = "*";
|
||||||
|
private static final String MAX_AGE = "3600L";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
||||||
|
// 非跨域请求,直接放行
|
||||||
|
ServerHttpRequest request = exchange.getRequest();
|
||||||
|
if (!CorsUtils.isCorsRequest(request)) {
|
||||||
|
return chain.filter(exchange);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置跨域响应头
|
||||||
|
ServerHttpResponse response = exchange.getResponse();
|
||||||
|
HttpHeaders headers = response.getHeaders();
|
||||||
|
headers.add("Access-Control-Allow-Origin", ALL);
|
||||||
|
headers.add("Access-Control-Allow-Methods", ALL);
|
||||||
|
headers.add("Access-Control-Allow-Headers", ALL);
|
||||||
|
headers.add("Access-Control-Max-Age", MAX_AGE);
|
||||||
|
if (request.getMethod() == HttpMethod.OPTIONS) {
|
||||||
|
response.setStatusCode(HttpStatus.OK);
|
||||||
|
return Mono.empty();
|
||||||
|
}
|
||||||
|
return chain.filter(exchange);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue