Как настроить кросс-доменные запросы (CORS) в Reactor Netty?

Как я могу обрабатывать запросы CORS в моем серверном приложении таким образом, чтобы обрабатывать только запросы OPTIONS, а все остальные запросы передавать в обработчик? Может быть, существуют другие способы обработки запросов в контексте CORS, которые я мог бы применить к моему коду? 

```java
public void run() {
    HttpServer.create()
            .host(this.config.getHost())
            .port(this.config.getPort())
            .runOn(eventLoopGroup.newEventLoopGroup())
            .protocol(HttpProtocol.HTTP11)
            .handle((request, response) -> {
                if (request.method().equals(HttpMethod.OPTIONS)) 
                    return response
                        .header("Access-Control-Allow-Origin", "*")
                        .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
                        .header("Access-Control-Allow-Headers", "Content-Type, Authorization")
                        .sendHeaders();
                else 
                    ???????
            })
            .route(this.provider::run)
            .bindUntilJavaShutdown(Duration.ofSeconds(30), this::onStart);
}
```
  • 20 января 2024 г. 23:18
Ответы на вопрос 2
Reactor Netty предоставляет более высокоуровневые абстракции для обработки HTTP-запросов, в том числе и поддержку CORS, благодаря чему вы можете настроить CORS для определённых роутов или для всего сервера. В любом случае, вы должны начать с указания правил CORS как часть конфигурации вашего HTTP-сервера.

Для создания правил CORS в Reactor Netty можно использовать класс `CorsHandler` и добавить обработчик CORS в цепочку обработки запроса. Вы можете сконфигурировать CORS глобально для всех путей или же для конкретного пути.

Пример создания глобальной политики CORS:

```java
public void run() {
    HttpServer.create()
            .host(this.config.getHost())
            .port(this.config.getPort())
            .runOn(eventLoopGroup.newEventLoopGroup())
            .protocol(HttpProtocol.HTTP11)
            .handle((request, response) -> {
                HttpMethod method = request.method();
                
                // Обработка запроса OPTIONS с помощью CORS
                if (HttpMethod.OPTIONS.equals(method)) {
                    return CorsHandler.create("http://example.com", "GET, POST, PUT, DELETE")
                                     .allowedRequestHeaders("Content-Type", "Authorization")
                                     .handle(request, response)
                                     .send();
                }
                
                // Ваша логика обработки для не-OPTIONS запросов
                if (HttpMethod.GET.equals(method)) {
                    // Обработчик для GET-запросов
                } else if (HttpMethod.POST.equals(method)) {
                    // Обработчик для POST-запросов
                }
                // ... обработка других методов
            })
            .route(this.provider::run)
            .bindUntilJavaShutdown(Duration.ofSeconds(30), this::onStart);
}
```

Если вы хотите сконфигурировать CORS для конкретных роутов, вы можете использовать `route` метод для настройки обработки определённых путей и методов:

```java
public void run() {
    CorsConfig corsConfig = CorsConfig.builder()
            .allowCredentials(true)
            .allowedOrigins("http://example.com")
            .allowedHeaders("Content-Type", "Authorization")
            .allowedMethods("GET, POST, PUT, DELETE")
            .build();

    HttpServer.create()
            .host(this.config.getHost())
            .port(this.config.getPort())
            .runOn(eventLoopGroup.newEventLoopGroup())
            .protocol(HttpProtocol.HTTP11)
            .route(routes -> {
                routes
                    .options("/my-api-path", (request, response) -> 
                        CorsHandler.create(corsConfig).handle(request, response).send())
                    .get("/my-api-path", this::myApiGetHandler);
                    // Другие пути и методы
            })
            .bindUntilJavaShutdown(Duration.ofSeconds(30), this::onStart);
}

public Mono<Void> myApiGetHandler(HttpServerRequest request, HttpServerResponse response) {
    // Ваш обработчик GET-запросов
}
```

Пожалуйста, примите во внимание, что CORS-конфигурация должна соответствовать вашему конкретному случаю использования и требованиям безопасности. В приведённых выше примерах используются очень общие настройки, и возможно, вам потребуется настроить их более тщательно. Также может потребоваться изменить строки `"http://example.com"` на фактический источник, с которого должны быть разрешены CORS-запросы.
возможно, вы знаете другие способы обработки запросов помощников CORS?

Spring Security
https://stackoverflow.com/a/57081659/15454143
Похожие вопросы