Spring Boot, включающий CORS с помощью application.properties

Я использую Spring Boot API RESTful, чтобы автоматически вставал ваш класс сущностей. Я использую этот apiRest из интерфейсного веб-приложения, но он дает мне эту ошибку:

В запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin"

Я устанавливаю конфигурацию CORS, используя указанные здесь свойства applicationantion.properties.

Моя основная конфигурация:

endpoints.cors.allow-credentials=true
endpoints.cors.allowed-origins=*
endpoints.cors.allowed-methods=*
endpoints.cors.allowed-headers=*

Я пробовал разные комбинации в этих переменных, но все еще не работает. Есть идеи?

Ответ 1

Я получил ответ сам:

Просто добавьте это в application.java

  @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
            }
        };
    }

Ответ 2

Это не очень понятно в официальной документации Spring, и ее легко ввести в заблуждение официальной Spring загрузочной документацией связанной здесь

По правде говоря, вы НЕ МОЖЕТ установить глобальную конфигурацию CORS, используя файл application.properties. Вы ИМЕЕТЕ использовать JavaConfig, как описано здесь.

Просто используйте аннотацию @EnableWebMvc в классе @Configuration, которая расширяет WebMvcConfigurerAdapter и переопределяет метод addCorsMappings следующим образом:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @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);
    }
}

Ответ 3

Spring свойства загрузки, предваряемые endpoints.cors. * используются Actuator, поэтому почему это не будет работать с конечными точками MVC.

Ответ 4

В любом случае мы можем переместить фактические URL, связанные с cors, в application.properties. Это работает для меня с Spring Boot 5.

App.java (основной класс):

@SpringBootApplication
public class App extends SpringBootServletInitializer {

    @Autowired
    private Environment env;

    public static void main(String[] args) {
        SpringApplication.run(ReportsApplication.class, args);
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                String urls = env.getProperty("cors.urls");
                CorsRegistration reg = registry.addMapping("/api/**");
                for(String url: urls.split(",")) {
                    reg.allowedOrigins(url);
                }
            }
        };
    }    
}

application.properties:

cors.urls=http://localhost:3000

Ответ 5

Это даже просто spring boot2, просто укажите URL-адрес междомена в управляющих активаторах, как это

management.endpoints.web.cors.allowed-origins=http://examaple.com ,http://examaple1.com 
management.endpoints.web.cors.allowed-methods=GET, POST

Ответ 6

Проверено с Spring-Boot 2.1.2:

Прежде всего необходимо знать, какие фильтры сервлетов уже установлены. Фильтры сервлетов должны добавить заголовок ответа "Access-Control-Allow-Origin". Я посмотрел в своих весенних журналах и решил добавить CorsFilter, который изначально пришел из Spring.

@Bean
public CorsFilter corsFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("http://127.0.0.1:4200");
    config.addAllowedOrigin("http://localhost:4200");
    config.addAllowedHeader("*");
    config.setAllowedMethods(Arrays.asList("OPTIONS", "GET"));

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/actuator/**", config);

    return new CorsFilter(source);
}

Поскольку вы вводите CorsFilter - вы можете легко увидеть, что там происходит. В этом случае - мы достигаем ДРУГОЙ конечной точки, чем "/привод/**". Конфигурация для этого недоступна.

enter image description here

Выше (ноль) не означает, что "Access-Control-Allow-Origin" не будет присутствовать. Он может быть добавлен фильтром, отличным от введенного нами (например, если у вас есть контроллер с аннотацией @CrossOrigin - заголовок перекрестного источника будет добавлен в какой-то другой фильтр MVC, отличный от нашего CorsFilter).

В случае ниже мы нажимаем/привод:

enter image description here

Вы также можете создать свой собственный фильтр, который добавляет заголовок в http-response. Я думаю, что лучше использовать стандартный подход, но в некоторых случаях отладки может быть полезно знать, что, добавив строку в ваш фильтр - вы можете добавить желаемое.

response.addHeader("Access-Control-Allow-Origin", "*");

Обратите внимание, что выше не содержит условной проверки, предложенной ранее.

Надеюсь это поможет. ура