cors header
This commit is contained in:
@@ -10,62 +10,79 @@ import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
public class CorsHeaderFilter implements GlobalFilter, Ordered {
|
||||
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
|
||||
// Add CORS headers to response
|
||||
// Handle preflight requests immediately
|
||||
if (request.getMethod().name().equals("OPTIONS")) {
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
HttpHeaders headers = response.getHeaders();
|
||||
|
||||
// Remove any existing CORS headers to prevent duplication
|
||||
// Clear any existing CORS headers
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN);
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS);
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS);
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS);
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_MAX_AGE);
|
||||
|
||||
// Get the origin from the request
|
||||
// Set CORS headers for preflight
|
||||
String origin = request.getHeaders().getFirst(HttpHeaders.ORIGIN);
|
||||
|
||||
// Set CORS headers based on the origin
|
||||
if (origin != null && isAllowedOrigin(origin)) {
|
||||
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, origin);
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, origin);
|
||||
} else {
|
||||
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "https://konturai.kz");
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "https://konturai.kz");
|
||||
}
|
||||
|
||||
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS");
|
||||
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
|
||||
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
|
||||
headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600");
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS");
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600");
|
||||
|
||||
// Handle preflight requests
|
||||
if (request.getMethod().name().equals("OPTIONS")) {
|
||||
response.setStatusCode(org.springframework.http.HttpStatus.OK);
|
||||
return Mono.empty();
|
||||
}
|
||||
|
||||
return chain.filter(exchange);
|
||||
// For non-preflight requests, process after the downstream service responds
|
||||
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
HttpHeaders headers = response.getHeaders();
|
||||
|
||||
// Clear any existing CORS headers from downstream service
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN);
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS);
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS);
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS);
|
||||
headers.remove(HttpHeaders.ACCESS_CONTROL_MAX_AGE);
|
||||
|
||||
// Set our CORS headers
|
||||
String origin = request.getHeaders().getFirst(HttpHeaders.ORIGIN);
|
||||
if (origin != null && isAllowedOrigin(origin)) {
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, origin);
|
||||
} else {
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "https://konturai.kz");
|
||||
}
|
||||
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS");
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
|
||||
headers.set(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600");
|
||||
}));
|
||||
}
|
||||
|
||||
private boolean isAllowedOrigin(String origin) {
|
||||
return origin != null && (
|
||||
origin.equals("https://konturai.kz") ||
|
||||
return origin != null && (origin.equals("https://konturai.kz") ||
|
||||
origin.startsWith("http://localhost:") ||
|
||||
origin.startsWith("http://127.0.0.1:") ||
|
||||
origin.startsWith("https://localhost:") ||
|
||||
origin.startsWith("https://127.0.0.1:")
|
||||
);
|
||||
origin.startsWith("https://127.0.0.1:"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return -1; // High priority to run before other filters
|
||||
return 1000; // Low priority to run after other filters and downstream services
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user