CORS s proljećem
1. Pregled
U bilo kojem suvremenom pregledniku Cross-Origin Resource Sharing (CORS) relevantna je specifikacija s pojavom HTML5 i JS klijenata koji troše podatke putem REST API-ja.
U mnogim slučajevima domaćin koji poslužuje JS (npr. primjer.com) razlikuje se od hosta koji služi podacima (npr. api.example.com). U takvom slučaju CORS omogućuje komunikaciju između domena.
Spring pruža prvoklasnu podršku za CORS, nudeći jednostavan i moćan način konfiguriranja u bilo kojoj web aplikaciji Spring ili Spring Boot.
2. Način kontrolera CORS konfiguracija
Omogućavanje CORS-a jednostavno je - samo dodajte napomenu @CrossOrigin.
To možemo provesti na nekoliko različitih načina.
2.1. @CrossOrigin na a @ RequestMapping-Anotated Handler Method
@RestController @RequestMapping ("/ account") javna klasa AccountController {@CrossOrigin @RequestMapping (method = RequestMethod.GET, path = "/ {id}") preuzimanje javnog računa (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") uklanjanje javne praznine (@PathVariable Long id) {// ...}}
U gornjem primjeru omogućili smo CORS samo za dohvatiti () metoda. Vidimo da nismo postavili nikakvu konfiguraciju za @CrossOrigin napomena, pa koristi zadane postavke:
- Dopuštena su sva podrijetla
- Dopuštene HTTP metode su one navedene u @RequestMapping napomena (za ovaj je primjer GET)
- Vrijeme memoriranja odgovora na pretisak (maxAge) je 30 minuta
2.2. @CrossOrigin na kontroleru
@CrossOrigin (poreklo = "//example.com", maxAge = 3600) @RestController @RequestMapping ("/ account") javna klasa AccountController {@RequestMapping (method = RequestMethod.GET, path = "/ {id}") public Dohvaćanje računa (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") javna void uklanjanje (@PathVariable Long id) {// ...}}
Ovaj put, dodali smo @CrossOrigin na razini razreda. Slijedom toga, oboje dohvatiti () i ukloniti() metode omogućuju. Konfiguraciju možemo prilagoditi specificiranjem vrijednosti jednog od atributa bilješke: podrijetla, metode, dopuštenoGlave, izloženiGlave, allowCredentials, ili maxAge.
2.3. @CrossOrigin o metodi kontrolera i rukovatelja
@CrossOrigin (maxAge = 3600) @RestController @RequestMapping ("/ account") javna klasa AccountController {@CrossOrigin ("// example.com") @RequestMapping (method = RequestMethod.GET, "/ {id}") javni račun dohvatiti (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") javna praznina ukloniti (@PathVariable Long id) {// ...}}
Spring će kombinirati atribute obje bilješke kako bi stvorio spojenu CORS konfiguraciju.
U ovom primjeru obje metode imat će a maxAge od 3600 sekundi, metoda ukloniti() omogućit će sva podrijetla, ali metoda dohvatiti () dopustit će samo podrijetlo iz //primjer.com.
3. Globalna CORS konfiguracija
Kao alternativu sitnozrnatoj konfiguraciji koja se temelji na napomenama, Spring nam omogućuje da definiramo neke globalne CORS konfiguracije iz vaših kontrolera. To je slično korištenju a filtar temeljena otopina, ali se može deklarirati unutar Spring MVC-a i kombinirati s sitnozrnim @CrossOrigin konfiguracija.
Prema zadanim postavkama dopuštena su sva podrijetla i metode GET, HEAD i POST.
3.1. JavaConfig
@Configuration @EnableWebMvc javna klasa WebConfig implementira WebMvcConfigurer {@Override public void addCorsMappings (registar CorsRegistry) {registry.addMapping ("/ **"); }}
Gornji primjer omogućuje CORS zahtjeve iz bilo kojeg podrijetla do bilo koje krajnje točke u aplikaciji.
Ako ovo želimo još malo zaključati, registar.addMapping metoda vraća a CorsRegistration objekt, koji možemo koristiti za dodatnu konfiguraciju. Tu je i allowedOrigins metoda koja nam omogućuje da odredimo niz dopuštenih podrijetla. To može biti korisno ako tijekom izvođenja trebamo učitati ovaj niz iz vanjskog izvora.
Osim toga, postoje i dopušteneMetode, dopuštenoGlave, izloženiGlave, maxAge, i allowCredentials koje možemo koristiti za postavljanje zaglavlja odgovora i mogućnosti prilagodbe.
3.2. XML prostor imena
Ova minimalna XML konfiguracija omogućuje CORS na a /** obrazac puta s istim zadanim svojstvima kao onaj JavaConfig:
Također je moguće prijaviti nekoliko CORS preslikavanja s prilagođenim svojstvima:
4. CORS s Spring Security
Ako u našem projektu koristimo Spring Security, moramo poduzeti dodatni korak kako bismo bili sigurni da se dobro poklapa s CORS-om. To je zato što se CORS mora prvo obraditi. Inače, Spring Security odbit će zahtjev prije nego što stigne na Spring MVC.
Srećom, Spring Security nudi izvanredno rješenje:
@EnableWebSecurity javna klasa WebSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (HttpSecurity http) baca izuzetak {http.cors (). I () ...}}
Ovaj članak to detaljnije objašnjava.
5. Kako to djeluje
Zahtjevi za CORS automatski se šalju raznim registriranim HandlerMappings. Oni obrađuju CORS zahtjeve za predlet i presreću jednostavne i stvarne zahtjeve CORS-a pomoću a CorsProcessor provedba (DefaultCorsProcessor prema zadanim postavkama) za dodavanje relevantnih zaglavlja odgovora CORS (poput Access-Control-Allow-Origin).
CorsConfiguration omogućuje nam da odredimo kako se CORS zahtjevi trebaju obrađivati: dopušteno podrijetlo, zaglavlja i metode, između ostalog. Možemo ga pružiti na razne načine:
- AbstractHandlerMapping # setCorsConfiguration () omogućuje određivanje a Karta s nekoliko CorsConfigurations mapiraju se na obrasce puta kao što su / api / **
- Podrazredi mogu pružiti svoje CorsConfiguration nadjačavanjem AbstractHandlerMapping # getCorsConfiguration (Object, HttpServletRequest) metoda
- Voditelji mogu implementirati CorsConfigurationSource sučelje (poput ResourceHttpRequestHandler sada čini) pružiti a CorsConfiguration za svaki zahtjev
6. Zaključak
U ovom smo članku pokazali kako Spring pruža podršku za omogućavanje CORS-a u našoj aplikaciji.
Počeli smo s konfiguracijom kontrolera. Vidjeli smo da trebamo dodati samo napomenu @CrossOrigin za omogućavanje CORS-a ili na određenu metodu ili na čitav kontroler.
Napokon smo također vidjeli da ako želimo kontrolirati CORS konfiguraciju izvan kontrolera, to možemo glatko izvesti u konfiguracijskim datotekama - bilo pomoću JavaConfig ili XML.
Potpuni izvorni kod za primjere dostupan je na GitHubu.