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: