Глобальная конфигурация CORS с использованием Java Config не работает

Мне трудно получить глобальную конфигурацию CORS с использованием конфигурации Java для работы. Я не уверен, что это известная проблема, потому что у других людей такая же проблема: Конфигурация Spring Global CORS не работает, но конфигурация на уровне контроллера работает

В любом случае, позвольте мне уточнить, что я пытаюсь сделать:

Я использую Spring 4.2.3.RELEASE (без весенней загрузки). Я пытаюсь настроить глобальную конфигурацию CORS с помощью конфигурации Java, чтобы я мог внедрить домен CORS (разрешенное происхождение), используя @Value из файла свойств. Поскольку, насколько мне известно, я не могу ввести значение в пространство имен mvc xml для разрешенного происхождения, как показано ниже (пожалуйста, дайте мне знать, если вы знаете какой-либо другой подход к этой проблеме):

<mvc:cors>
        <mvc:mapping path="/**" allowed-origins="${vrm.cors.domain}"
                     allowed-methods="*"
                     allowed-headers="*"
                     allow-credentials="false" max-age="3600"/>
</mvc:cors>

Из справочного документа Spring здесь я Я пытаюсь настроить Global CORS, используя конфигурацию Java, чтобы решить проблему. Однако я не могу заставить CORS работать. Коды вызывают во время запуска приложения, но вызов от клиентов всегда возвращается

В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, источник 'http://localhost:3000' не имеет доступа

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    @Value("${vrm.cors.domain}")
    //vrm.cors.domain=/**
    private String corsDomain;

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

person Dane Savot    schedule 09.05.2017    source источник
comment
Почему vrm.cors.domain установлено на /**? Разве это не должно быть *, если вы хотите разрешить все?   -  person jingx    schedule 09.05.2017
comment
Извините, это была ошибка в моих примерах кодов. Я обновился для того же.   -  person Dane Savot    schedule 09.05.2017


Ответы (1)


Согласно этому ответу https://stackoverflow.com/a/33823253

Вы можете включить cors следующим образом:

@EnableWebSecurity
@Configuration
class SecurityConfig extends WebSecurityConfigurerAdapter {

  private final AppProperties appProperties;

  @Autowired
  public SecurityConfig(AppProperties appProperties) {
    this.appProperties = appProperties;
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterBefore(corsFilter(), SessionManagementFilter.class) //adds your custom CorsFilter
        .authorizeRequests()
        .antMatchers("/**")
        .permitAll()
        .and()
        .csrf()
        .disable();
  }

  private CorsFilter corsFilter() {
    return new CorsFilterAdapter(
        appProperties.getClientUrls(),
        appProperties.getHeaders(),
        appProperties.getMethods())
        .corsFilter();
  }
}

Где CrosFilterAdapter примерно так:

public class CorsFilterAdapter {

  private final String[] clientUrls;
  private final String[] headers;
  private final String[] methods;

  public CorsFilterAdapter(String clientUrls, String headers, String methods) {
    this.clientUrls = clientUrls.split(",");
    this.headers = headers.split(",");
    this.methods = methods.split(",");
  }

  public CorsFilter corsFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(false);
    for (String clientUrl : clientUrls) {
      config.addAllowedOrigin(clientUrl);
    }
    for (String header: headers) {
      config.addAllowedHeader(header);
    }
    for (String method : methods) {
      config.addAllowedMethod(method);
    }
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
  }
}
person Alex Po    schedule 26.09.2017