Spring Заголовок CORS No 'Access-Control-Allow-Origin' присутствует
Я получаю следующую проблему после переноса web.xml на java config
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
Основываясь на нескольких ссылках Spring, была предпринята следующая попытка:
@Configuration
@ComponentScan(basePackageClasses = AppConfig.class, useDefaultFilters = false, includeFilters = {
@Filter(org.springframework.stereotype.Controller.class) })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*").allowedOrigins("*").allowedMethods("GET", "POST", "OPTIONS", "PUT")
.allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
"Access-Control-Request-Headers")
.exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
.allowCredentials(true).maxAge(3600);
}
}
Выбранные значения были взяты из рабочего фильтра web.xml:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>10</param-value>
</init-param> </filter> <filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Любые идеи, почему подход Spring java config не работает, как файл web.xml?
Ответы
Ответ 1
Измените CorsMapping с registry.addMapping("/*")
на registry.addMapping("/**")
в addCorsMappings
.
Ознакомьтесь с этой Spring документацией CORS .
Из документации -
Включение CORS для всего приложения так же просто, как:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
Вы можете легко изменить любые свойства, а также применить эту конфигурацию CORS к определенному шаблону пути:
@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);
}
}
Метод контроллера Конфигурация CORS
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
}
Чтобы включить CORS для всего контроллера -
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
Вы можете использовать как конфигурацию CORS на уровне контроллера, так и на уровне метода; Spring затем объединяет атрибуты обеих аннотаций для создания объединенной конфигурации CORS.
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("http://domain2.com")
@RequestMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
Ответ 2
У нас была та же проблема, и мы решили ее с помощью конфигурации Spring XML, как показано ниже:
Добавьте это в свой контекст xml файл
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="*"
allowed-headers="Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Authorization, X-Requested-With, requestId, Correlation-Id"
allowed-methods="GET, PUT, POST, DELETE"/>
</mvc:cors>
Ответ 3
Полезный совет - если вы используете для хранения данных Spring, вам нужен другой подход.
@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.getCorsRegistry().addMapping("/**")
.allowedOrigins("http://localhost:9000");
}
}
Ответ 4
Если вы используете Spring Security ver >= 4.2, вы можете использовать Spring встроенную поддержку безопасности вместо того, чтобы включать Apache:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
Пример выше был скопирован из сообщения Spring , в котором вы также можете найти информацию о том, как настроить CORS на контроллере, определенные методы контроллера и т.д. Кроме того, существуют также примеры конфигурации XML, а также Spring Загрузка интеграции.
Ответ 5
Следуя ответу Омара, я создал новый файл класса в моем проекте REST API под названием WebConfig.java
с этой конфигурацией:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*");
}
}
Это позволяет любому источнику получить доступ к API и применить его ко всем контроллерам в проекте Spring.
Ответ 6
Ответ на Omkar довольно всеобъемлющий.
Но часть части конфигурации Global изменилась.
Согласно весеннему ботинку 2.0.2.RELEASE
Начиная с версии 4.2, Spring MVC поддерживает CORS. Использование метода контроллера Конфигурация CORS с аннотациями @CrossOrigin в вашем приложении Spring Boot не требует какой-либо конкретной конфигурации. Глобальную конфигурацию CORS можно определить, зарегистрировав компонент WebMvcConfigurer с помощью настраиваемого метода addCorsMappings (CorsRegistry), как показано в следующем примере:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
Большинство ответов в этом сообщении с использованием WebMvcConfigurerAdapter
, однако
Тип WebMvcConfigurerAdapter устарел
Начиная с весны 5 вам просто нужно реализовать интерфейс WebMvcConfigurer:
public class MvcConfig implements WebMvcConfigurer {
Это связано с тем, что Java 8 представила методы по умолчанию на интерфейсах, которые охватывают функциональность класса WebMvcConfigurerAdapter
Ответ 7
У меня также были сообщения, на которых No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
Я правильно настроил корс, но то, что отсутствовало в webflux в RouterFuncion, было принято и заголовки contenttype APPLICATION_JSON, как в этом фрагменте кода:
@Bean
RouterFunction<ServerResponse> routes() {
return route(POST("/create")
.and(accept(APPLICATION_JSON))
.and(contentType(APPLICATION_JSON)), serverRequest -> create(serverRequest);
}
Ответ 8
Как отметил @Geoffrey, с пружинной безопасностью вам нужен другой подход, как описано здесь:
Spring Boot Security CORS
Ответ 9
По какой-то причине, если кто-то еще не может обойти CORS, напишите заголовок, какой браузер хочет получить доступ к вашему запросу.
Добавьте этот компонент в свой файл конфигурации.
@Bean
public WebSecurityConfigurerAdapter webSecurity() {
return new WebSecurityConfigurerAdapter() {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers().addHeaderWriter(
new StaticHeadersWriter("Access-Control-Allow-Origin", "*"));
}
};
}
Таким образом, мы можем сказать браузеру, что мы разрешаем перекрестное происхождение из любого источника. если вы хотите ограничить конкретный путь, измените "*" на {'http://localhost:3000', ""}.
Полезная ссылка, чтобы понять это поведение https://www.concretepage.com/spring-4/spring-4-rest-cors-integration-using-crossorigin-annotation-xml-filter-example