Po przeniesieniu pliku web.xml do konfiguracji java pojawia się następujący problem
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
Bazując na kilku źródłach Spring, podjęto następującą próbę:
@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);
}
}
Wybrane wartości zostały pobrane z działającego filtru 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>
Masz jakieś pomysły, dlaczego konfiguracja Spring java nie działa tak, jak plik web.xml?
źródło
addCorsMapping
nie zadziałało dla mnie, kusiło mnie, aby powiedzieć, że to z powodu wiosennego bezpieczeństwa ... jednak dodaniecorsConfigurationSource
fasoli, jak sugerowano tutaj, rozwiązało mój problem.Pomocna wskazówka - jeśli korzystasz z Spring Data Rest, potrzebujesz innego podejścia.
@Component public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.getCorsRegistry().addMapping("/**") .allowedOrigins("http://localhost:9000"); } }
źródło
RepositoryRestConfigurerAdapter
jest przestarzałe. Po prostu wdrażaRepositoryRestConfigurer
bezpośrednio.Mieliśmy ten sam problem i rozwiązaliśmy go za pomocą konfiguracji XML Springa, jak poniżej:
Dodaj to do swojego kontekstowego pliku 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>
źródło
Jeśli używasz Spring Security ver> = 4.2, możesz użyć natywnej obsługi Spring Security zamiast włączać Apache:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
Powyższy przykład został skopiowany z wpisu na blogu Springa, w którym można również znaleźć informacje o tym, jak skonfigurować CORS na kontrolerze, konkretne metody kontrolera itp. Ponadto są również przykłady konfiguracji XML, a także integracja Spring Boot.
źródło
Zgodnie z odpowiedzią Omara utworzyłem nowy plik klasy w moim projekcie REST API o nazwie
WebConfig.java
z taką konfiguracją:@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("*"); } }
Umożliwia to dowolnemu źródłu dostęp do interfejsu API i zastosowanie go do wszystkich kontrolerów w projekcie Spring.
źródło
Odpowiedź Omkara jest dość wyczerpująca.
Ale jakaś część globalnej konfiguracji uległa zmianie.
Zgodnie z odniesieniem do buta sprężynowego 2.0.2.RELEASE
@Configuration public class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**"); } }; } }
Większość odpowiedzi w tym poście
WebMvcConfigurerAdapter
jednak używaTyp WebMvcConfigurerAdapter jest przestarzały
źródło
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"); } }; } }
źródło
Miałem też wiadomości typu
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
Skonfigurowałem poprawnie cory, ale w webfluxie w RouterFuncion brakowało akceptacji i nagłówków contenttype APPLICATION_JSON jak w tym fragmencie kodu:
@Bean RouterFunction<ServerResponse> routes() { return route(POST("/create") .and(accept(APPLICATION_JSON)) .and(contentType(APPLICATION_JSON)), serverRequest -> create(serverRequest); }
źródło
jak zauważył @Geoffrey, z zabezpieczeniem sprężynowym potrzebujesz innego podejścia, jak opisano tutaj: Spring Boot Security CORS
źródło
Z jakiegoś powodu, jeśli nadal ktoś nie jest w stanie ominąć CORS, napisz nagłówek, którego przeglądarka chce uzyskać dostęp do twojego żądania.
Dodaj to ziarno do pliku konfiguracyjnego.
@Bean public WebSecurityConfigurerAdapter webSecurity() { return new WebSecurityConfigurerAdapter() { @Override protected void configure(HttpSecurity http) throws Exception { http.headers().addHeaderWriter( new StaticHeadersWriter("Access-Control-Allow-Origin", "*")); } }; }
W ten sposób możemy powiedzieć przeglądarce, że zezwalamy na cross-origin ze wszystkich źródeł. jeśli chcesz ograniczyć dostęp do określonej ścieżki, zmień „*” na {' http: // localhost: 3000 ', „”}.
Pomocne odniesienie do zrozumienia tego zachowania https://www.concretepage.com/spring-4/spring-4-rest-cors-integration-using-crossorigin-annotation-xml-filter-example
źródło
Znalazłem rozwiązanie w wiosennym rozruchu, używając adnotacji @CrossOrigin .
@RestController @CrossOrigin public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
źródło