CORS tavasszal

1. Áttekintés

Bármely modern böngészőben a Cross-Origin Resource Sharing (CORS) releváns specifikáció a HTML5 és JS kliensek megjelenésével, amelyek a REST API-n keresztül fogyasztanak adatokat.

Sok esetben a JS-t kiszolgáló gazdagép (pl. example.com) eltér az adatot kiszolgáló gazdagéptől (pl. api.example.com). Ilyen esetben a CORS lehetővé teszi a tartományok közötti kommunikációt.

A Spring első osztályú támogatást nyújt a CORS számára, egyszerű és hatékony módon konfigurálhatja azt bármely Spring vagy Spring Boot webalkalmazásban.

2. Vezérlő módszer CORS konfigurálása

A CORS engedélyezése egyszerű - csak adja hozzá a megjegyzéseket @CrossOrigin.

Ezt többféleképpen is megvalósíthatjuk.

2.1. @CrossOrigin rajta @ RequestMapping-Annotált kezelő módszer

@RestController @RequestMapping ("/ account") public class AccountController {@CrossOrigin @RequestMapping (method = RequestMethod.GET, path = "/ {id}") public Account retrieve (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") public void remove (@PathVariable Long id) {// ...}}

A fenti példában csak a CORS-t engedélyeztük a visszahoz() módszer. Láthatjuk, hogy nem állítottunk be konfigurációt a @CrossOrigin annotációval, ezért az alapértelmezéseket használja:

  • Minden származás megengedett
  • Az engedélyezett HTTP módszerek megegyeznek a @RequestMapping kommentár (erre a példára a GET)
  • Az idő, amikor az előnézeti válasz gyorsítótárazott (maxAge) 30 perc

2.2. @CrossOrigin a Vezérlőn

@CrossOrigin (origins = "//example.com", maxAge = 3600) @RestController @RequestMapping ("/ account") public class AccountController {@RequestMapping (method = RequestMethod.GET, path = "/ {id}") public Fiók lekérése (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") public void remove (@PathVariable Long id) {// ...}}

Ezúttal hozzátettük @CrossOrigin osztály szinten. Következésképpen mindkettő visszahoz() és eltávolítás () módszerek lehetővé tették. Testreszabhatjuk a konfigurációt az egyik annotációs attribútum értékének megadásával: eredet, mód, megengedettHeaders, kitettHeaders, allowCredentials, vagy maxAge.

2.3. @CrossOrigin a vezérlő és kezelő módszerről

@CrossOrigin (maxAge = 3600) @RestController @RequestMapping ("/ account") public class AccountController {@CrossOrigin ("// example.com") @RequestMapping (method = RequestMethod.GET, "/ {id}") public account retrieve (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") public void remove (@PathVariable Long id) {// ...}}

A Spring egyesíti a két annotáció attribútumait az egyesített CORS konfiguráció létrehozásához.

Ebben a példában mindkét módszer a maxAge 3600 másodperc alatt, a módszer eltávolítás () minden eredetet megenged, de a módszert visszahoz() csak származást enged meg //example.com.

3. Globális CORS konfiguráció

A finom szemcsés kommentárokon alapuló konfiguráció alternatívájaként a Spring lehetővé teszi, hogy meghatározzunk néhány globális CORS konfigurációt a vezérlőkből. Ez hasonló az a használatához Szűrő alapú megoldás, de deklarálható a Spring MVC-n belül, és finom szemcsével kombinálható @CrossOrigin konfiguráció.

Alapértelmezés szerint minden origó és GET, HEAD és POST metódus megengedett.

3.1. JavaConfig

@Configuration @EnableWebMvc public class A WebConfig megvalósítja a WebMvcConfigurer {@Override public void addCorsMappings (CorsRegistry nyilvántartás) {register.addMapping ("/ **"); }}

A fenti példa lehetővé teszi a CORS-kérelmek bármilyen származásától az alkalmazás bármely végpontjáig.

Ha ezt még egy kicsit le akarjuk zárni, akkor a register.addMapping metódus a CorsRegistration objektum, amelyet további konfiguráláshoz használhatunk. Van még egy megengedettOrigins módszer, amely lehetővé teszi számunkra az engedélyezett eredetek tömbjének megadását. Ez hasznos lehet, ha futás közben ezt a tömböt külső forrásból kell betöltenünk.

Ezen kívül vannak még MegengedettMódszerek, megengedettHeaders, kitettHeaders, maxAge, és allowCredentials amelyet felhasználhatunk a válaszfejlécek és a testreszabási opciók beállításához.

3.2. XML névtér

Ez a minimális XML konfiguráció lehetővé teszi a CORS használatát a /** elérési útminta ugyanazokkal az alapértelmezett tulajdonságokkal, mint a JavaConfigé:

Több CORS-hozzárendelés deklarálható testreszabott tulajdonságokkal is:

4. CORS rugós biztonsággal

Ha projektünkben a Spring Security-t alkalmazzuk, akkor további lépéseket kell tennünk annak érdekében, hogy megbizonyosodjon arról, hogy jól működik-e a CORS-szal. Ez azért van, mert először a CORS-ot kell feldolgozni. Ellenkező esetben a Spring Security elutasítja a kérést, még mielőtt elérné a Spring MVC-t.

Szerencsére a Spring Security a dobozon kívüli megoldást nyújt:

@EnableWebSecurity nyilvános osztály A WebSecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {@Orride védett void konfigurációt (HttpSecurity http) a {http.cors (). És () ...}} kivételeket dobja

Ez a cikk részletesebben elmagyarázza.

5. Hogyan működik

A CORS kéréseket automatikusan elküldik a különféle regisztráltaknak HandlerMappings. Kezelik a CORS preflight kéréseit, és a a. Segítségével egyszerű és tényleges kéréseket fognak el CorsProcesszor végrehajtás (DefaultCorsProcessor alapértelmezés szerint) a megfelelő CORS válaszfejlécek (például Access-Control-Allow-Origin).

CorsConfiguration lehetővé teszi számunkra, hogy meghatározzuk a CORS-kérelmek feldolgozásának módját: többek között az engedélyezett eredeteket, fejléceket és módszereket. Különböző módon biztosíthatjuk:

  • AbstractHandlerMapping # setCorsConfiguration () lehetővé teszi az egyik megadását a Térkép többel CorsConfigurations olyan pályamintákra térképezzük fel, mint pl / api / **
  • Az alosztályok megadhatják a sajátjukat CorsConfiguration felülírva a AbstractHandlerMapping # getCorsConfiguration (Object, HttpServletRequest) módszer
  • A kezelők megvalósíthatják a CorsConfigurationSource interfész (például ResourceHttpRequestHandler most teszi) a CorsConfiguration minden egyes kéréshez

6. Következtetés

Ebben a cikkben megmutattuk, hogy a Spring hogyan nyújt támogatást a CORS alkalmazásunk engedélyezéséhez.

A vezérlő konfigurációjával kezdtük. Láttuk, hogy csak a jegyzetet kell hozzáadnunk @CrossOrigin a CORS engedélyezése akár egy adott módszerre, akár a teljes vezérlőre.

Végül azt is láttuk, hogy ha a CORS konfigurációt a vezérlőkön kívül akarjuk irányítani, akkor ezt simán elvégezhetjük a konfigurációs fájlokban - akár JavaConfig, akár XML segítségével.

A példák teljes forráskódja elérhető a GitHub oldalon.


$config[zx-auto] not found$config[zx-overlay] not found