origins invalid headers expose example crossorigin control allow all java spring-mvc http-headers cors cross-domain

java - invalid - spring boot cors allow all origins



La configuración de Spring Global CORS no funciona, pero la configuración a nivel de controlador sí lo hace (6)

Estoy tratando de configurar CORS globalmente a través de WebMvcConfigurerAdapter muestra a continuación. Para probar, estoy llegando a mi punto final de API a través de una aplicación de nodo pequeño que creé para emular un servicio externo. Cuando intento este enfoque, la respuesta no contiene los encabezados correctos y falla con

XMLHttpRequest cannot load http://localhost:8080/api/query/1121. No ''Access-Control-Allow-Origin'' header is present on the requested resource. Origin ''http://localhost:333'' is therefore not allowed access.

Configuración global

import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/query/**") .allowedOrigins("*") .allowedHeaders("*") .allowCredentials(true); } }

Sin embargo, cuando utilizo la anotación @CrossOrigin así funciona bien respondiendo con los encabezados adecuados.

@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*") @RestController @RequestMapping(value = "/api/query", produces = MediaType.APPLICATION_JSON_VALUE) public class QueryController { ...... }

Produce

Access-Control-Allow-Credentials:true Access-Control-Allow-Origin:http://localhost:333

¿Qué me falta para hacer que la configuración global funcione? (Siga las instrucciones aquí https://spring.io/blog/2015/06/08/cors-support-in-spring-framework ). Siento que me estoy perdiendo algo simple ya que la anotación del controlador funciona bien.


Creo que a tu definición de mapeo le falta un * :

registry.addMapping("/api/query/**")

Sin ese extra * , esta configuración no se asigna a la ruta de solicitud /api/query/1121 (pero funcionaría en /api/query/5 ).


Para que la configuración global de CORS funcione, el cliente debe agregar estos dos encabezados en la solicitud de OPCIONES.

Origin: http://host.com Access-Control-Request-Method: POST

Sin embargo, la anotación de @CrossOrigin requiere solo el encabezado "Origen".
Su cliente probablemente agrega el encabezado "Origen" pero le falta el "Método de solicitud de control de acceso" ... por eso le funciona a usted con @CrossOrigin, pero no con la configuración global.


Pude lograr que la configuración de Spring Global CORS funcionara, después de experimentar el problema exacto documentado en este problema. Tuve que hacer 2 cosas:

  1. allowedOrigins no puede ser * si allowCredentials es verdadero. Esto está documentado en Mozilla.org

  2. Elimine mvc: anotación controlada del XML de Spring. No se puede tener TANTO la configuración XML y @EnableWebMvc. La clase global no funcionará sin @EnableWebMvc, por lo que se debe eliminar mvc: annotation-driven.


Tuve un problema similar y ninguno de los métodos pareció funcionar (excepto el uso de la anotación @CrossOrigin para cada controlador). Seguí la solución de Bharat Singh que aparece más arriba y después de un poco de depuración de los aspectos internos de Spring Framework, esto es lo que me funcionó ( Spring Boot 2.0.6 + Spring Framework 5.0.10 ):

@Configuration public class WebMvcConfiguration extends WebMvcConfigurationSupport { /* (non-Javadoc) * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry) */ @Override protected void addCorsMappings(CorsRegistry registry) { //NOTE: servlet context set in "application.properties" is "/api" and request like "/api/session/login" resolves here to "/session/login"! registry.addMapping("/**") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedOrigins("*") .allowedHeaders("*") .allowCredentials(false); } }

Inicialmente, cuando usé el mapeo "/api/**" se configuró en Spring, pero como la aplicación se implementó con el contexto "/api" , las solicitudes como "/api/session/login" se asignaron internamente a "/session/login" y no se encontró dicha asignación en la configuración de CORS - ¡preste atención a eso!


no ha declarado un método en él, que de forma predeterminada solo acepta el método get. intente registry.allowedMethods("*");


Me enfrenté a un problema similar. Cambié el WebMvcConfigurerAdapter a WebMvcConfigurationSupport y comenzó a funcionar.

Además de esto, también moví el RequestMappingHandlerMapping definido en el archivo de configuración xml a la configuración java.