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.