Recibo el siguiente problema después de migrar web.xml a la configuración de Java
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
Basado en algunas referencias de Spring, se ha intentado el siguiente intento:
@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);
}
}
Los valores elegidos se tomaron de un filtro web.xml en funcionamiento:
<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>
¿Alguna idea de por qué el enfoque de configuración de Spring java no funciona como lo hizo el archivo web.xml?
fuente
addCorsMapping
no funcionó para mí, tentado a decir que es debido a la seguridad de primavera ..., sin embargo, agregar uncorsConfigurationSource
bean como se sugiere aquí resolvió mi problema.Consejo útil: si está utilizando el descanso de datos de Spring, necesita un enfoque diferente.
@Component public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.getCorsRegistry().addMapping("/**") .allowedOrigins("http://localhost:9000"); } }
fuente
RepositoryRestConfigurerAdapter
es obsoleto. Simplemente implementaRepositoryRestConfigurer
directamente.Tuvimos el mismo problema y lo resolvimos usando la configuración XML de Spring como se muestra a continuación:
Agregue esto en su archivo xml de contexto
<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>
fuente
Si está utilizando Spring Security ver> = 4.2, puede usar el soporte nativo de Spring Security en lugar de incluir el de Apache:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
El ejemplo anterior se copió de una publicación de blog de Spring en la que también puede encontrar información sobre cómo configurar CORS en un controlador, métodos de controlador específicos, etc. Además, también hay ejemplos de configuración XML, así como la integración de Spring Boot.
fuente
Siguiendo la respuesta de Omar, creé un nuevo archivo de clase en mi proyecto de API REST llamado
WebConfig.java
con esta configuración:@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("*"); } }
Esto permite que cualquier origen acceda a la API y la aplique a todos los controladores del proyecto Spring.
fuente
La respuesta de Omkar es bastante completa.
Pero una parte de la parte de configuración global ha cambiado.
Según la referencia de 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/**"); } }; } }
La mayoría responde en esta publicación usando
WebMvcConfigurerAdapter
, sin embargoEl tipo WebMvcConfigurerAdapter está en desuso
fuente
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"); } }; } }
fuente
También tuve mensajes como
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
Había configurado cors correctamente, pero lo que faltaba en webflux en RouterFuncion eran los encabezados de accept y contenttype APPLICATION_JSON como en este fragmento de código:
@Bean RouterFunction<ServerResponse> routes() { return route(POST("/create") .and(accept(APPLICATION_JSON)) .and(contentType(APPLICATION_JSON)), serverRequest -> create(serverRequest); }
fuente
como señaló @Geoffrey, con Spring Security, necesita un enfoque diferente como se describe aquí: Spring Boot Security CORS
fuente
Por alguna razón, si todavía alguien no puede omitir CORS, escriba el encabezado del navegador que desea acceder a su solicitud.
Agregue este bean dentro de su archivo de configuración.
@Bean public WebSecurityConfigurerAdapter webSecurity() { return new WebSecurityConfigurerAdapter() { @Override protected void configure(HttpSecurity http) throws Exception { http.headers().addHeaderWriter( new StaticHeadersWriter("Access-Control-Allow-Origin", "*")); } }; }
De esta manera podemos decirle al navegador que estamos permitiendo el origen cruzado de todos los orígenes. si desea restringir desde una ruta específica, cambie el "*" a {' http: // localhost: 3000 ', ""}.
Útil referencia para comprender este comportamiento https://www.concretepage.com/spring-4/spring-4-rest-cors-integration-using-crossorigin-annotation-xml-filter-example
fuente
Encontré la solución en Spring Boot usando la anotación @CrossOrigin .
@RestController @CrossOrigin public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } }
fuente