From 725f719ed756f180fd2aba018c6eaf90a0666681 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 14 Sep 2025 15:51:24 +0500 Subject: [PATCH] don't strip --- .../api_gateway/filter/CorsHeaderFilter.java | 71 +++++++++++++++++++ src/main/resources/application.yml | 17 +---- 2 files changed, 73 insertions(+), 15 deletions(-) create mode 100644 src/main/java/konturai/kz/api_gateway/filter/CorsHeaderFilter.java diff --git a/src/main/java/konturai/kz/api_gateway/filter/CorsHeaderFilter.java b/src/main/java/konturai/kz/api_gateway/filter/CorsHeaderFilter.java new file mode 100644 index 0000000..25270d2 --- /dev/null +++ b/src/main/java/konturai/kz/api_gateway/filter/CorsHeaderFilter.java @@ -0,0 +1,71 @@ +package konturai.kz.api_gateway.filter; + +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.HttpHeaders; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +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 filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + ServerHttpResponse response = exchange.getResponse(); + + // Add CORS headers to response + HttpHeaders headers = response.getHeaders(); + + // Remove any existing CORS headers to prevent duplication + 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 + 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); + } else { + headers.add(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"); + + // Handle preflight requests + if (request.getMethod().name().equals("OPTIONS")) { + response.setStatusCode(org.springframework.http.HttpStatus.OK); + return Mono.empty(); + } + + return chain.filter(exchange); + } + + private boolean isAllowedOrigin(String origin) { + 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:") + ); + } + + @Override + public int getOrder() { + return -1; // High priority to run before other filters + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 41ef339..511be45 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -13,7 +13,7 @@ spring: predicates: - Path=/api/parser/** filters: - - StripPrefix=2 # Убираем /api/parser + - StripPrefix=0 # Сохраняем полный путь /api/parser order: 1 # <-- Высокий приоритет # Маршрут по умолчанию для Core сервиса (НИЗКИЙ ПРИОРИТЕТ) @@ -23,20 +23,7 @@ spring: - Path=/** # <-- Матчится со всеми путями order: 100 # <-- Низкий приоритет (сработает последним) - # CORS конфигурация для поддержки кросс-доменных запросов - globalcors: - corsConfigurations: - '[/**]': - allowedOriginPatterns: - - '*' - allowedMethods: - - GET - - POST - - PUT - - DELETE - - OPTIONS - allowedHeaders: '*' - allowCredentials: true + # CORS обрабатывается через CorsHeaderFilter # Логирование для отладки маршрутизации logging: