Spring MVC дозволяє обробляти CORS (спільне використання ресурсів між різними джерелами).

Вступ

З міркувань безпеки браузери забороняють AJAX-звернення до ресурсів за межами поточного джерела. Наприклад, у вас може бути свій банківський рахунок на одній вкладці, а evil.com – на іншій. Скрипти із сайту evil.com не повинні мати можливості здійснювати AJAX-запити до API вашого банку з вашими обліковими даними – наприклад, знімати гроші з вашого рахунку!

Спільне використання ресурсів між різними джерелами (CORS) – це специфікація W3C, реалізована в більшості браузерів, яка дозволяє визначати, які міждоменні запити дозволені, замість того, щоб використовувати менш безпечні та менш потужні обхідні шляхи, засновані на IFRAME або JSONP.

Обробка

Специфікація CORS розрізняє попередні, прості та фактичні запити. Щоб зрозуміти, як працює CORS, можете ознайомитися з цією статтею, цією статтею, окрім іншого, або звернутися за детальною інформацією до специфікації.

Реалізації HandlerMapping із Spring MVC забезпечують вбудовану підтримку CORS. Після успішного відображення запиту на обробник, реалізації HandlerMapping перевіряють конфігурацію CORS для даного запиту та обробника та роблять подальші дії. Попередні запити обробляються безпосередньо, а прості та фактичні CORS-запити перехоплюються, валідуються, і для них встановлюються необхідні заголовки CORS-відповіді.

Для того, щоб дозволити запити між різними джерелами (тобто заголовок Origin є і відрізняється від хоста запиту), вам необхідно забезпечити деяку явно оголошену конфігурацію CORS. Якщо відповідної конфігурації CORS не знайдено, попередні запити відхиляються. У відповіді на прості та фактичні CORS-запити не додаються CORS-заголовки, і, отже, браузери їх відхиляють.

Кожен HandlerMapping може бути конфігурований індивідуально за допомогою відображень CorsConfiguration на основі URL-шаблонів. У більшості випадків програми використовують Java-конфігурацію MVC або простір імен XML для оголошення таких відображень, внаслідок чого всім екземплярам HandlerMapping передається одна глобальна Map.

Можна поєднувати глобальне налаштування CORS на рівні HandlerMapping з більш тонким налаштуванням CORS на рівні обробників. Наприклад, анотовані контролери можуть використовувати анотації @CrossOrigin на рівні класів або методів (інші обробники можуть реалізувати CorsConfigurationSource).

Правила комбінування глобальної та локальної конфігурації зазвичай адитивні - наприклад, все глобальне і всі локальні джерела. Для тих атрибутів, де може бути прийнято лише одне значення, наприклад, allowCredentials та maxAge, локальне значення перевизначає глобальне. Докладнішу інформацію див. у розділі, присвяченому CorsConfiguration#combine(CorsConfiguration).

Щоб отримати більше з джерела або здійснити розширене налаштування, ознайомтеся з кодом:

  • CorsConfiguration

  • CorsProcessor, DefaultCorsProcessor

  • AbstractHandlerMapping

@CrossOrigin

Інструкція @CrossOrigin дозволяє виконувати запити між різними джерелами до анотованих методів контролера, як показано в наступному прикладі:

@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping ("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }