После переноса web.xml в конфигурацию java у меня возникает следующая проблема
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?
источник
addCorsMapping
не сработало для меня, хотелось сказать, что это из-за весенней безопасности ..., однако добавлениеcorsConfigurationSource
bean-компонента, как здесь предлагается, решило мою проблему.Полезный совет - если вы используете Spring data rest, вам нужен другой подход.
@Component public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.getCorsRegistry().addMapping("/**") .allowedOrigins("http://localhost:9000"); } }
источник
RepositoryRestConfigurerAdapter
устарел. Просто реализуетRepositoryRestConfigurer
напрямую.У нас была такая же проблема, и мы решили ее, используя конфигурацию XML Spring, как показано ниже:
Добавьте это в свой контекстный 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>
источник
Если вы используете Spring Security ver> = 4.2, вы можете использовать встроенную поддержку Spring Security вместо включения Apache:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
Приведенный выше пример был скопирован из сообщения в блоге Spring, в котором вы также можете найти информацию о том, как настроить CORS на контроллере, конкретных методах контроллера и т. Д. Кроме того, есть также примеры конфигурации XML, а также интеграция Spring Boot.
источник
Следуя ответу Омара, я создал новый файл класса в своем проекте REST API
WebConfig.java
с такой конфигурацией:@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("*"); } }
Это позволяет любому источнику получить доступ к API и применяет его ко всем контроллерам в проекте Spring.
источник
Ответ Омкара довольно исчерпывающий.
Но какая-то часть глобальной конфигурации изменилась.
По ссылке spring boot 2.0.2.RELEASE
@Configuration public class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**"); } }; } }
Большинство ответов в этом сообщении
WebMvcConfigurerAdapter
, однакоТип WebMvcConfigurerAdapter устарел.
источник
public class TrackingSystemApplication {
public static void main(String[] args) { SpringApplication.run(TrackingSystemApplication.class, args); } @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("http://localhost:4200").allowedMethods("PUT", "DELETE", "GET", "POST"); } }; } }
источник
У меня также были сообщения вроде
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
Я правильно настроил cors, но в webflux в RouterFuncion не хватало заголовков accept и contenttype APPLICATION_JSON, как в этом фрагменте кода:
@Bean RouterFunction<ServerResponse> routes() { return route(POST("/create") .and(accept(APPLICATION_JSON)) .and(contentType(APPLICATION_JSON)), serverRequest -> create(serverRequest); }
источник
как отметил @Geoffrey, с весенней безопасностью вам нужен другой подход, как описано здесь: Spring Boot Security CORS
источник
По какой-то причине, если все же кто-то не может обойти CORS, напишите заголовок, браузер которого хочет получить доступ к вашему запросу.
Добавьте этот bean-компонент в свой файл конфигурации.
@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
источник
Я нашел решение в весенней загрузке с помощью аннотации @CrossOrigin .
@RestController @CrossOrigin public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
источник