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", "*");
Обратите внимание, что выше не содержит условной проверки, предложенной ранее.
Надеюсь это поможет. ура