CORS je bezpečnostný mechanizmus v prehliadačoch, ktorý zabraňuje webovým aplikáciám robiť požiadavky na iný server, než z ktorého boli načítané. Ak sa frontend (napr. Angular) pokúsi zavolať API z iného pôvodu (origin), prehliadač požiadavku zablokuje – ak API neodpovie s povolením.
Príklad: Vaše Angular UI beží na http://localhost:4200
, ale REST API na http://localhost:8080
. Ide o tzv. cross-origin request, ktorý musí byť schválený cez CORS hlavičky.
Riešením je odpovedať na požiadavku správnymi CORS hlavičkami, napríklad:
Access-Control-Allow-Origin: http://localhost:4200 Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Content-Type
V Java EE kontejnere môžete nastaviť CORS pomocou filtra:
@Provider public class CORSFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext request, ContainerResponseContext response) { response.getHeaders().add("Access-Control-Allow-Origin", "*"); response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS"); response.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Authorization"); } }
Pre väčšiu bezpečnosť namiesto "*"
použite konkrétny pôvod.
Aj keď je CORS štandardný spôsob, niekedy je lepšie použiť:
CORS by mal byť dočasné riešenie pri vývoji, nie produkčné obchádzanie politiky pôvodu.
Pri požiadavkách s hlavičkami (napr. Authorization
) prehliadač najprv odošle tzv. OPTIONS preflight request. Ak vaša služba na túto požiadavku neodpovie správne, hlavný request bude zablokovaný.
Najčastejšie chyby:
Access-Control-Allow-Origin missing
– chyba hlavičkyMethod OPTIONS not allowed
– backend neimplementuje OPTIONS metóduCredentials not allowed
– ak používate withCredentials
, hlavička nesmie byť *
Pridajte OPTIONS handler alebo použite framework, ktorý ho podporuje (napr. Jersey, Spring Boot).
Tomcat: môžete pridať CORS filter do web.xml
alebo ako servlet filter v kóde.
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"); } }; }
Jersey: použite ContainerResponseFilter
(ako vyššie).
Všetky tieto kroky si môžete osvojiť v kurze Java REST služby s Hibernate, kde vytvoríte kompletnú REST službu, pripojíte ju na databázu a zabezpečíte komunikáciu s frontendom v Angulari.
Viac informacií preberáme na kurze: