CORS je bezpečnostní mechanismus, který zabraňuje JavaScriptu přistupovat k API na jiné doméně, než byla načtena stránka. Pokud klient běží na http://localhost:4200
a API na http://localhost:8080
, jde o tzv. cross-origin požadavek, který musí server výslovně povolit.
Pro povolení CORS odpovězte s těmito hlavičkami:
Access-Control-Allow-Origin: http://localhost:4200 Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Content-Type
V Java EE použijte filtr:
@Provider public class CORSFilter implements ContainerResponseFilter { public void filter(ContainerRequestContext req, ContainerResponseContext res) { res.getHeaders().add("Access-Control-Allow-Origin", "*"); res.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS"); res.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Authorization"); } }
V produkčním prostředí je vhodnější použít:
CORS je výhodný ve vývoji, ale v produkci může skrývat bezpečnostní rizika, hlavně pri použití *
.
Při volání API s hlavičkami probíhá tzv. preflight – tedy kontrolní požadavek typu OPTIONS. Pokud na něj server neodpoví správně, hlavní požadavek nebude doručen.
Access-Control-Allow-Headers
*
v Allow-Origin
Tomcat: konfigurace přes web.xml
nebo filter
Spring Boot:
@Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://localhost:4200") .allowedMethods("GET", "POST", "PUT", "DELETE"); } }; }
Tohle vše si vyzkoušíte v kurzu Java REST služby s Hibernate, kde si vytvoříte REST API, nastavíte CORS a připojíte Angular frontend.
Viac informacií preberáme na kurze: