Es posible que encuentres el siguiente mensaje de error:
ha sido bloqueado por la política CORS: no hay ningún encabezado 'Access-Control-Allow-Origin' presente en el recurso solicitado
Este error indica que el protocolo CORS ha bloqueado una solicitud a una determinada dirección porque falta el encabezado Access-Control-Allow-Origin en el recurso.
La causa principal de los problemas de origen cruzado es que los navegadores, por razones de seguridad, restringen el acceso a recursos fuera del sitio actual.
Por ejemplo, considere un sitio web alojado en http://127.0.0.1:8080/ con una página determinada. Si accede a recursos desde el mismo sitio, no hay restricciones. Pero si intenta acceder a recursos desde un sitio diferente (por ejemplo, http://127.0.0.1:8081), el navegador bloqueará la solicitud.
Nota: Consideramos el protocolo, el dominio y el puerto como parte de la definición de un "mismo origen".
Los elementos con un atributo src, como las etiquetas img y script, no están sujetos a esta restricción.
Históricamente, cuando el front-end y el back-end no estaban separados, las páginas y las interfaces de solicitud existían bajo el mismo dominio y puerto. Luego, los navegadores permitirían que las solicitudes de una página alojada en un dominio soliciten recursos del mismo dominio.
Por ejemplo, http://127.0.0.1:8080/index.html puede solicitar libremente http://127.0.0.1:8080/a/b/c/userLit.
Hoy en día, con el front-end y el back-end separados en diferentes aplicaciones, esto no está permitido y provocará problemas de CORS.
El origen (o fuente) consta del protocolo, dominio y número de puerto.
Una URL se compone de protocolo, dominio, puerto y ruta. Dos URL se consideran del "mismo origen" si su protocolo, dominio y puerto son todos idénticos. Cualquier diferencia en cualquiera de estos tres elementos constituye una solicitud de origen cruzado.
Considere las comparaciones entre orígenes para https://www.baidu.com/index.html:
URL | Origen cruzado | Razón |
---|---|---|
https://www.baidu.com/more/index.html | No | Mismo protocolo, dominio y puerto |
https://map.baidu.com/ | Sí | Dominio diferente |
http://www.baidu.com/index.html | Sí | Protocolo diferente |
https://www.baidu.com:81/index.html | Sí | Puerto diferente |
La Política del Mismo Origen es una característica de seguridad fundamental del navegador. Sin él, la funcionalidad normal de los navegadores podría estar en riesgo. La arquitectura web depende en gran medida de esta política y los navegadores la implementan para garantizar la seguridad.
La Política del Mismo Origen incluye:
En un proyecto donde el front-end y el back-end se implementan por separado, abordar CORS es crucial. Las cookies se utilizan para almacenar información de inicio de sesión del usuario y los interceptores Spring administran los permisos. Surgen problemas cuando el interceptor y CORS se procesan en el orden incorrecto, lo que provoca un error de CORS.
Una solicitud HTTP primero pasa por el filtro antes de llegar al servlet y luego al interceptor. Para garantizar que el procesamiento de CORS se produzca antes de la interceptación de la autorización, podemos colocar la configuración de CORS en un filtro.
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
Si bien JSONP puede abordar problemas de origen cruzado en el front-end, solo admite solicitudes GET, lo cual es limitante en aplicaciones RESTful. En su lugar, puede manejar solicitudes de orígenes cruzados con el uso compartido de recursos entre orígenes (CORS) en el back-end. Esta solución no es exclusiva de Spring Boot y se ha utilizado en marcos SSM tradicionales. Lo configura implementando la interfaz WebMvcConfigurer y anulando el método addCorsMappings.
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
Puede habilitar CORS para métodos de controlador específicos agregando la anotación @CrossOrigin a la anotación @RequestMapping. De forma predeterminada, @CrossOrigin permite todos los orígenes y métodos HTTP especificados en @RequestMapping.
@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
Comprensión de los parámetros de @CrossOrigin:
Ejemplo:
@CrossOrigin @RestController public class PersonController { @RequestMapping(method = RequestMethod.GET) public String add() { // some code } }
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3