CORS в Spring Webflux

В предыдущих двух статьях я постарался вкратце объяснить, что такое протокол CORS и как он работает, а также как сконфигурировать его поддержку в веб-приложениях на основе Spring и Servlet API. В этой статье я предлагаю разобраться с настройками CORS на стороне реактивного веб-приложения на основе Spring Webflux.

Настройка CORS в Spring Webflux

За поддержку CORS на стороне реактивных веб-приложений, основанных на Spring Webflux, отвечает фильтр CorsWebFilter. Аналогично веб-приложениям на основе Servlet API все необходимые компоненты находятся именно в самом Spring Webflux. Поэтому для включения поддержки CORS в вашем веб-приложении вам не потребуются дополнительные зависимости.

Всё, что нужно для настройки CORS — зарегистрировать в контексте приложения компонент CorsWebFilter:

Основные компоненты, используемые для настройки CORS: CorsConfigurationSource и CorsConfiguration.

CorsConfigurationSource

Интерфейс CorsConfigurationSource объявляет метод getCorsConfiguration, который возвращает настройки CORS, наиболее подходящие для полученного запроса.

Основная реализация данного интерфейса — это класс UrlBasedCorsConfigurationSource, который может хранить множество настроек CORS и определяет наиболее подходящие по URL запроса.

Для регистрации настроек CORS в классе UrlBasedCorsConfigurationSource есть метод registerCorsConfiguration, который в качестве аргумента принимает шаблон URL и связанные с ним настройки.

CorsConfiguration

Класс CorsConfiguration описывает настройки CORS и содержит следующие свойства:

  • allowedOrigins — список разрешённых адресов, с которых могут выполняться CORS-запросы
  • allowedMethods — список разрешённых методов
  • allowedHeaders — список разрешённых заголовков
  • exposedHeaders — список заголовков, к которым может иметь доступ JavaScript
  • allowCredentials — разрешено ли передавать учётные данные в запросах
  • allowPrivateNetwork — разрешены ли запросы из-за пределов частной сети
  • maxAge — максимальное время в секундах, которое браузер должен хранить настройки CORS

Настройка CORS в Spring Security Reactive

В Spring Security Reactive для CORS есть соответствующий конфигуратор, позволяющий сконфигурировать CORS привычным для Spring Security способом:

Если в контексте приложения зарегистрирован компоненты CorsWebFilter или CorsConfigurationSource, то Spring Security будет использовать их.

Оптимизация работы со Spring Boot

Spring Boot не предоставляет инструментов для быстрой настройки CORS, и вероятно не будет. Однако в реальных условиях хочется иметь возможность динамически гибко изменять настройки CORS без необходимости в последующей пересборке проекта. Для этого мне потребуется класс свойств, который будет содержать связку между шаблоном пути и параметрами CORS. Я могу также создать класс, описывающий параметры CORS, но вместо этого я буду использовать существующий CorsProperties:

Для реализации используется именно LinkedHashMap, так как желательно применять правила в том порядке, в котором они описываются.

Теперь мне нужно зарегистрировать данный класс свойств в приложении:

Теперь я могу описать настройки CORS в application.yaml следующим образом:

Обратите ваше внимание на экранирование шаблонов путей: "[/**]", нужно это чтобы не терялся ведущий / и не возникало ошибок парсинга.

Дело осталось за малым — использовать UrlBasedCorsConfigurationProperties для создания CorsWebFilter. Если не используется Spring Security, это будет выглядеть следующим образом:

И если используется Spring Security:

Полезные ссылки

CORS в Spring Web

В предыдущей статье я постарался вкратце объяснить, что такое протокол CORS и как он работает. В этой статье я предлагаю разобраться с настройками CORS на стороне Spring Web, Spring Security и Spring Boot.

Читать далее CORS в Spring Web

Cross-Origin Resource Sharing (CORS)

Наверняка большинство веб-разработчиков когда-то сталкивались с CORS при выполнении межсайтовых запросов из JavaScript. Причём на эти запросы либо приходили ответы со статусом 403 Forbidden, либо сам браузер отказывался работать с запросом или даже успешным ответом. Предлагаю разобраться с темой CORS.

Читать далее Cross-Origin Resource Sharing (CORS)