Estoy usando Spring Boot v1.5.1 y parece que mi restricción en el origen de CORS no funciona.
Mi archivo application.properties tiene la siguiente línea ( ref1 ref2 ).
endpoints.cors.allowed-origins=http://mydomain.ioMi controlador REST tiene el siguiente aspecto.
@RestController @CrossOrigin @RequestMapping("/api/car") public class CarCtrl { @Autowired private CarService carService; @GetMapping public Car get() { return carService.getLatest(); } } Sin embargo, cuando abro un navegador y escribo http://localhost:8080/api/car todavía puedo acceder al punto final REST.
También traté de cambiar mi anotación de la siguiente manera, pero eso no funciona.
@CrossOrigin("${endpoints.cors.allowed-origins}")¿Alguna idea sobre lo que estoy haciendo mal?
Tenga en cuenta que no estoy usando WebMvcConfigurerAdapter como esta publicación . ¿Realmente necesito extender esta clase para controlar explícitamente el origen? Pensé que la anotación @CrossOrigin además de la configuración del archivo de propiedades podría controlar los orígenes permitidos (en lugar de tener que hacerlo mediante programación).
Sin embargo, cuando abro un navegador y escribo http://localhost:8080/api/car todavía puedo acceder al punto final REST.
La configuración de orígenes permitidos de CORS no hace que los servidores bloqueen las solicitudes.
Y debido a que el servidor no bloquea la solicitud, eso no le impide abrir la URL directamente en un navegador.
La política del mismo origen es lo que impone restricciones de origen cruzado, y la política del mismo origen solo se aplica a JavaScript frontend en aplicaciones web que se ejecutan en un navegador web y usan XHR o Fetch o jQuery $.ajax(…) o lo que sea para realizar solicitudes de origen cruzado.
Entonces, CORS no es una forma de hacer que los servidores bloqueen las solicitudes. Y, por lo tanto, tampoco es una forma de evitar que los usuarios puedan navegar directamente a una URL, y no es una forma de evitar que cualquier herramienta que no sea una aplicación web, como curl o Postman o lo que sea, acceda a la URL.
La especificación explícita del dominio como cadena en @CrossOrigin(" http://mydomain.io ") funcionará. No creo que esto funcione @CrossOrigin("${endpoints.cors.allowed-origins}").
En cuanto a mí, estoy agregando s CrossRef Filter en mis aplicaciones.
package com.alexfrndz.filter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.filter.GenericFilterBean; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class SimpleCORSFilter extends GenericFilterBean { /** * The Logger for this class. */ private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) resp; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type"); //response.setHeader("Access-Control-Allow-Credentials", "true"); chain.doFilter(req, resp); } }