CORS в Spring Web

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

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

За поддержку CORS на стороне веб-приложений, основанных на Servlet API, в экосистеме Spring отвечает именно Spring Web — фильтр CorsFilter (не путать с одноимённым фильтром из Catalina) и все необходимые для его настройки классы и интерфейсы находятся именно в этом модуле, а не в Spring Security. Поэтому для включения поддержки CORS в вашем веб-приложении на основе Spring вам не потребуются дополнительные зависимости.

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

Основные компоненты, используемые для настройки 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

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

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

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

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

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

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

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

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

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

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

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