Рубрики
Без рубрики

ШНУР с пружиной

Простая конфигурация для автомобилей со встроенной поддержкой Spring MVC.

Автор оригинала: baeldung.

1. Обзор

В любом современном браузере совместное использование ресурсов между источниками (CORS) является актуальной спецификацией с появлением клиентов HTML5 и JS, которые потребляют данные через API REST.

Во многих случаях хост, обслуживающий JS (например, example.com ) отличается от хоста, который обслуживает данные (например, api.example.com ). В таком случае CORS обеспечивает междоменную связь.

Spring предоставляет первоклассную поддержку для CORS, предлагая простой и мощный способ его настройки в любом веб-приложении Spring или Spring Boot.

Дальнейшее чтение:

Фиксация 401s с помощью предварительных фар CORS и пружинной защиты

Поток и СЕРДЕЧНИК пружинного полотна

2. Конфигурация CORS метода контроллера

Включение CORS просто – просто добавьте аннотацию @CrossOrigin .

Мы можем реализовать это несколькими различными способами.

2.1. @CrossOrigin в методе обработчика с аннотацией @RequestMapping

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @RequestMapping(method = RequestMethod.GET, path = "/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

В приведенном выше примере мы включили CORS только для метода retrieve () . Мы видим, что мы не установили никакой конфигурации для аннотации @CrossOrigin , поэтому она использует значения по умолчанию:

  • Все источники разрешены
  • Разрешенные методы HTTP-это те, которые указаны в аннотации @RequestMapping (для этого примера GET)
  • Время кэширования предполетного ответа ( максимальный возраст) составляет 30 минут

2.2. @CrossOrigin на контроллере

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @RequestMapping(method = RequestMethod.GET, path = "/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

На этот раз мы добавили @CrossOrigin на уровне класса. Следовательно, оба метода retrieve() и remove() включены. Мы можем настроить конфигурацию, указав значение одного из атрибутов аннотации: origins , methods , allowedHeaders , exposedHeaders , allowCredentials, или maxAge.

2.3. @CrossOrigin о методе контроллера и обработчика

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("http://example.com")
    @RequestMapping(method = RequestMethod.GET, "/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

Spring объединит атрибуты из обеих аннотаций для создания объединенной конфигурации CORS.

В этом примере оба метода будут иметь менеджер 3600 секунд, метод remove() разрешит все исходные данные, но метод retrieve() разрешит только исходные данные из http://example.com.

3. Глобальная конфигурация CORS

В качестве альтернативы мелкозернистой конфигурации на основе аннотаций Spring позволяет нам определить некоторую глобальную конфигурацию CORS из ваших контроллеров. Это похоже на использование решения на основе Filter , но может быть объявлено в Spring MVC и объединено с мелкозернистой конфигурацией @CrossOrigin .

По умолчанию разрешены все методы origins и GET, HEAD и POST.

3.1. JavaConfig

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

Приведенный выше пример позволяет выполнять запросы CORS от любого источника к любой конечной точке приложения.

Если мы хотим заблокировать это немного больше, метод registry.addMapping возвращает объект Corsa Registration , который мы можем использовать для дополнительной настройки. Существует также метод allowedOrigins , который позволяет нам указать массив разрешенных источников. Это может быть полезно, если нам нужно загрузить этот массив из внешнего источника во время выполнения.

Кроме того, существуют также разрешенные методы , разрешенные заголовки , открытые заголовки , управление и разрешенные учетные данные , которые мы можем использовать для установки заголовков ответов и параметров настройки.

3.2. Пространство имен XML

Эта минимальная конфигурация XML включает CORS в шаблоне пути /** с теми же свойствами по умолчанию, что и у JavaConfig:


    

Также можно объявить несколько сопоставлений CORS с настраиваемыми свойствами:



    

    

4. СЕРДЕЧНИКИ с пружинной защитой

Если мы используем Spring Security в нашем проекте, мы должны сделать дополнительный шаг, чтобы убедиться, что он хорошо работает с CORS. Это потому, что сначала нужно обработать CORS. В противном случае Spring Security отклонит запрос до того, как он достигнет Spring MVC.

К счастью, Spring Security предоставляет готовое решение:

@EnableWebSecurity
	public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	    @Override
	    protected void configure(HttpSecurity http) throws Exception {
	        http.cors().and()...
	    }
	}

В этой статье это объясняется более подробно.

5. Как Это Работает

Запросы CORS автоматически отправляются различным зарегистрированным сопоставлениям обработчиков . Они обрабатывают предварительные запросы CORS и перехватывают простые и фактические запросы КУРСА, используя Текстовый процессор реализацию ( DefaultCorsProcessor по умолчанию), чтобы добавить соответствующие заголовки ответов CORS (например, Access-Control-Allow-Origin ).

Конфигурация Cors позволяет нам указать, как должны обрабатываться запросы CORS: разрешенные источники, заголовки и методы, среди прочего. Мы можем предоставить его различными способами:

  • AbstractHandlerMapping#set Cors Configuration() позволяет указать Карту с несколькими corsConfiguration s, отображенными на шаблоны путей, такие как /api/**
  • Подклассы могут предоставить свою собственную конфигурацию Cors , переопределив метод AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)
  • Обработчики могут реализовать Источник конфигурации Cors интерфейс (например, ResourceHttpRequestHandler теперь идет), чтобы обеспечить corsConfiguration для каждого запроса

6. Заключение

В этой статье мы показали, как Spring обеспечивает поддержку включения CORS в нашем приложении.

Мы начали с настройки контроллера. Мы увидели, что нам нужно только добавить аннотацию @CrossOrigin , чтобы включить CORS либо для одного конкретного метода, либо для всего контроллера.

Наконец, мы также увидели, что если мы хотим управлять конфигурацией CORS вне контроллеров, мы можем плавно выполнить это в файлах конфигурации – либо с помощью JavaConfig, либо с помощью XML.

Полный исходный код примеров доступен на GitHub .