Spring CROS решает междоменные проблемы AJAX

Spring MVC Безопасность Ajax

иллюстрировать

  1. Из соображений безопасности браузеры запрещают вызовы AJAX к ресурсам, находящимся за пределами текущего источника. Например, пока вы проверяете свой банковский счет в одной вкладке, вы можете поместить сайт evil.com в другую. Скрипты evil.com не могут выполнять AJAX-запросы к API вашего банка (снимать деньги с вашего счета), используя ваши учетные данные!
  2. Совместное использование исходных ресурсов(КОРС) дабольшинство браузеровосуществленныйСпецификация W3C, позволяет вам гибко указать, какие запросы между источниками разрешены, вместо использования некоторых менее безопасных и менее мощных хаков, таких как IFrame или JSONP.
  3. 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: разрешенные источники, заголовки, методы и т. д. Она может быть предоставлена ​​различными способами:

  1. AbstractHandlerMapping#setCorsConfiguration()Разрешить сопоставление шаблонов путейMapнесколькоCorsConfigurationуказать/api/**
  2. Подклассы могутCorsConfigurationпутем переписыванияAbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)методы предоставляют свои собственные подклассы
  3. Обработчик может реализовать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;
    }
}