Как реализовать CORS в Reactor Netty?

CORS (Cross-Origin Resource Sharing) - это механизм, который позволяет серверу указывать, какие ресурсы на нём будут доступны для запросов с других доменов. В контексте Reactor Netty, который является фреймворком для разработки серверов на языке Java, CORS можно реализовать следующим образом:

1. Создайте класс, который будет отвечать за настройку CORS.

import io.netty.handler.codec.http.HttpMethod;
import reactor.netty.http.server.HttpServer;
import reactor.netty.http.server.HttpServerRequest;
import reactor.netty.http.server.HttpServerResponse;
import reactor.netty.http.server.HttpServerRoutes;
import reactor.netty.http.server.HttpServerRequest;
import reactor.netty.http.server.HttpServerResponse;
import reactor.netty.http.server.HttpServerRequest;
import reactor.netty.http.server.HttpServerResponse;

public class CorsConfig {

  public static void main(String[] args) {
    HttpServer.create()
      .route(routes -> routes
          .get("/api/data", CorsConfig::handleDataRequest))
      .bindNow()
      .onDispose()
      .block();
  }

  private static void handleDataRequest(HttpServerRequest request, HttpServerResponse response) {
    // проверяем тип запроса
    if (request.method() == HttpMethod.OPTIONS) {
      // задаем разрешенные методы и заголовки
      response.headers().add("Access-Control-Allow-Methods", "GET");
      response.headers().add("Access-Control-Allow-Headers", "Content-Type, Authorization");
      // задаем максимальное время жизни предзапроса
      response.headers().add("Access-Control-Max-Age", "3600");
      // возвращаем успешный ответ
      response.send();
    } else {
      // задаем разрешенные домены
      response.headers().add("Access-Control-Allow-Origin", "http://example.com");
      // возвращаем данные
      response.sendString(Mono.just("Data response"));
    }
  }
}

2. Запустите HTTP-сервер и обрабатывайте запросы.

import reactor.netty.http.server.HttpServer;

public class Main {

  public static void main(String[] args) {
    HttpServer.create()
      .route(routes -> routes
          .get("/api/data", CorsConfig::handleDataRequest))
      .bindNow()
      .onDispose()
      .block();
  }

  private static void handleDataRequest(HttpServerRequest request, HttpServerResponse response) {
    // проверяем тип запроса
    if (request.method() == HttpMethod.OPTIONS) {
      // задаем разрешенные методы и заголовки
      response.headers().add("Access-Control-Allow-Methods", "GET");
      response.headers().add("Access-Control-Allow-Headers", "Content-Type, Authorization");
      // задаем максимальное время жизни предзапроса
      response.headers().add("Access-Control-Max-Age", "3600");
      // возвращаем успешный ответ
      response.send();
    } else {
      // задаем разрешенные домены
      response.headers().add("Access-Control-Allow-Origin", "http://example.com");
      // возвращаем данные
      response.sendString(Mono.just("Data response"));
    }
  }
}

В данном примере мы создали HTTP-сервер с помощью Reactor Netty и определили обработчик для запроса на URL /api/data. В методе handleDataRequest мы проверяем тип запроса: если это предзапрос (OPTIONS), то задаем разрешенные методы и заголовки, а также максимальное время жизни предзапроса. Если это запрос GET, то задаем разрешенные домены и возвращаем данные.