иллюстрировать
- Из соображений безопасности браузеры запрещают вызовы AJAX к ресурсам, находящимся за пределами текущего источника. Например, пока вы проверяете свой банковский счет в одной вкладке, вы можете поместить сайт evil.com в другую. Скрипты evil.com не могут выполнять AJAX-запросы к API вашего банка (снимать деньги с вашего счета), используя ваши учетные данные!
- Совместное использование исходных ресурсов(КОРС) дабольшинство браузеровосуществленныйСпецификация W3C, позволяет вам гибко указать, какие запросы между источниками разрешены, вместо использования некоторых менее безопасных и менее мощных хаков, таких как IFrame или JSONP.
- Spring Framework 4.2 GAдля нестандартныхCORSпри условииПервоклассная поддержка, дает вам больше, чем обычныйфильтр на основеРешение представляет собой более простой и мощный способ настройки.
Spring MVC предоставляет расширенные возможности настройки
Конфигурация метода контроллера CORS
-
Вы можете спросить
@RequestMapping
Добавлен метод обработчика аннотаций@CrossOrigin
аннотацию, чтобы CORS был включен (по умолчанию@CrossOrigin
разрешать@RequestMapping
Все пусковые иHTTP
метод):@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... }
}
-
CORS также можно включить для всего контроллера:
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600) @RestController @RequestMapping("/account") public class AccountController { @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
В этом примере для обоих методовretrieve()
а такжеremove()
Во всех методах обработчика включена поддержка CORS, вы также можете увидеть, как использовать@CrossOrigin
Свойства для настройки конфигурации CORS.
Вы даже можете использовать конфигурацию CORS как на уровне контроллера, так и на уровне метода, а затем Spring объединит два атрибута аннотаций для создания объединенной конфигурации CORS.
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin(origins = "http://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
Если вы используете Spring Security, убедитесь, чтоВключить CORS на уровне безопасности Spring, и позволить ему использовать преимущества конфигурации, определенной на уровне Spring MVC.
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()...
}
}
Глобальная конфигурация CORS
В дополнение к детальной конфигурации на основе аннотаций вы также можете определить некоторую глобальную конфигурацию CORS. Это похоже на использование фильтров, но может быть объявлено с помощью Spring MVC и объединено с мелкозернистым фильтром.@CrossOrigin
конфигурация. По умолчанию все источники иGET
,HEAD
а такжеPOST
методы разрешены.
JavaConfig
Включение CORS для всего приложения выглядит примерно так:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
Если вы используете Spring Boot, рекомендуется просто объявитьWebMvcConfigurer
Бобы следующие:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
};
}
}
Вы можете легко изменить любое свойство, а также применить эту конфигурацию CORS только к определенным шаблонам пути:
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
Если вы используете Spring Security, убедитесь, чтоВключить CORS на уровне безопасности Spring, и позволить ему использовать преимущества конфигурации, определенной на уровне Spring MVC.
пространство имен XML
также можно использоватьпространство имен mvc XMLНастроить КОРС.
Эта минимальная конфигурация XML делает/**
CORS для шаблонов пути имеет те же свойства по умолчанию, что и JavaConfig:
<mvc:cors>
<mvc:mapping path="/**" />
</mvc:cors>
Некоторые сопоставления CORS также могут быть объявлены с пользовательскими атрибутами:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="http://domain1.com, http://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="false"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="http://domain1.com" />
</mvc:cors>
если вы используетеSpring Security
Не забудьSpring Security
уровень启用CORS
:
<http>
<!-- Default to Spring MVC's CORS configuration -->
<cors />
...
</http>
Как это работает?
CORS-запрос (в том числе сOPTIONS
предварительная проверка метода) запросы автоматически отправляются наHandlerMapping
зарегистрированы разные. Они обрабатывают предварительные запросы CORS и перехватывают простые и практичные запросы CORS благодаряCorsProcessorвыполнить(DefaultCorsProcessorчтобы добавить соответствующие заголовки ответа CORS (по умолчанию)Access-Control-Allow-Origin
).CorsConfigurationПозволяет указать, как обрабатываются запросы CORS: разрешенные источники, заголовки, методы и т. д. Она может быть предоставлена различными способами:
-
AbstractHandlerMapping#setCorsConfiguration()
Разрешить сопоставление шаблонов путейMap
несколькоCorsConfigurationуказать/api/**
- Подклассы могут
CorsConfiguration
путем переписыванияAbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)
методы предоставляют свои собственные подклассы - Обработчик может реализовать
CorsConfigurationSource
интерфейс (какResourceHttpRequestHandler
сейчас), чтобы каждый запрос предоставлялCorsConfiguration.
На основе фильтров поддержки CORS
В качестве альтернативы другим методам, указанным выше,Spring Framework
также обеспечиваетCorsFilter. В этом случае вместо использования@CrossOrigin
илиWebMvcConfigurer#addCorsMappings(CorsRegistry)
Вы можете, например, весной
Фильтр объявляется в приложении Boot следующим образом:
@Configuration
public class MyConfiguration {
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://domain1.com");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}