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.