CORS s pružinou
1. Prehľad
V každom modernom prehliadači je zdieľanie zdrojov krížového pôvodu (CORS) relevantnou špecifikáciou s nástupom klientov HTML5 a JS, ktorí konzumujú údaje prostredníctvom rozhraní REST API.
V mnohých prípadoch hostiteľ, ktorý slúži JS (napr. example.com) sa líši od hostiteľa, ktorý údaje poskytuje (napr. api.example.com). V takom prípade CORS umožňuje komunikáciu medzi doménami.
Spring poskytuje prvotriednu podporu pre CORS a ponúka jednoduchý a výkonný spôsob konfigurácie v ľubovoľnej webovej aplikácii Spring alebo Spring Boot.
2. Konfigurácia metódy CORS radiča
Povolenie CORS je jednoduché - stačí pridať anotáciu @CrossOrigin.
Môžeme to implementovať niekoľkými rôznymi spôsobmi.
2.1. @CrossOrigin na a @ RequestMapping-Anotovaná metóda obsluhy
@RestController @RequestMapping ("/ account") verejná trieda AccountController {@CrossOrigin @RequestMapping (method = RequestMethod.GET, path = "/ {id}") verejné načítanie účtu (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") public void remove (@PathVariable Long id) {// ...}}
V príklade vyššie sme povolili iba CORS pre načítať () metóda. Vidíme, že sme nenastavili žiadnu konfiguráciu pre @CrossOrigin anotácie, takže používa predvolené hodnoty:
- Všetky pôvody sú povolené
- Povolené metódy HTTP sú metódy uvedené v @RequestMapping anotácia (v tomto príklade je GET)
- Čas, ktorý je uložený do pamäte cache pred výstupom (maxAge) je 30 minút
2.2. @CrossOrigin na ovládači
@CrossOrigin (origins = "//example.com", maxAge = 3600) @RestController @RequestMapping ("/ account") verejná trieda AccountController {@RequestMapping (method = RequestMethod.GET, path = "/ {id}") verejná Načítanie účtu (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") public void remove (@PathVariable Long id) {// ...}}
Tentokrát sme pridali @CrossOrigin na úrovni triedy. V dôsledku toho obaja načítať () a odstrániť () metódy to majú povolené. Konfiguráciu môžeme prispôsobiť zadaním hodnoty jedného z atribútov anotácie: počiatky, metódy, povolenéZáhlavia, vystavenéHlavičky, allowCredentials, alebo maxAge.
2.3. @CrossOrigin o metóde kontrolóra a manipulátora
@CrossOrigin (maxAge = 3600) @RestController @RequestMapping ("/ account") verejná trieda AccountController {@CrossOrigin ("// example.com") @RequestMapping (method = RequestMethod.GET, "/ {id}") verejný účet retrieve (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") public void remove (@PathVariable Long id) {// ...}}
Jar spojí atribúty z oboch anotácií a vytvorí zlúčenú konfiguráciu CORS.
V tomto príklade budú mať obidve metódy a maxAge 3600 sekúnd, metóda odstrániť () umožní všetky pôvody, ale metóda načítať () povolí iba pôvod z //example.com.
3. Globálna konfigurácia CORS
Ako alternatívu k jemnozrnnej konfigurácii založenej na anotáciách nám Spring umožňuje definovať globálnu konfiguráciu CORS z vašich radičov. Je to podobné ako pri použití a Filtrovať založené na riešení, ale môže byť deklarované v rámci Spring MVC a kombinované s jemnozrnnými @CrossOrigin konfigurácia.
V predvolenom nastavení sú povolené všetky pôvodné metódy a metódy GET, HEAD a POST.
3.1. JavaConfig
@Configuration @EnableWebMvc verejná trieda WebConfig implementuje WebMvcConfigurer {@Override public void addCorsMappings (register CorsRegistry) {registry.addMapping ("/ **"); }}
Vyššie uvedený príklad umožňuje žiadosti CORS z ľubovoľného pôvodu do ľubovoľného koncového bodu v aplikácii.
Ak to chceme trochu viac zamknúť, registry.addMapping metóda vracia a CorsRegistration objekt, ktorý môžeme použiť na ďalšiu konfiguráciu. K dispozícii je tiež povolenéPôvody metóda, ktorá nám umožňuje určiť pole povolených pôvodov. To môže byť užitočné, ak potrebujeme načítať toto pole z externého zdroja za behu.
Dodatočne existujú aj povolené Metódy, povolenéZáhlavia, vystavenéHlavičky, maxAgea allowCredentials ktoré môžeme použiť na nastavenie hlavičiek odpovedí a možností prispôsobenia.
3.2. Menný priestor XML
Táto minimálna konfigurácia XML umožňuje CORS na a /** vzor cesty s rovnakými predvolenými vlastnosťami ako má JavaConfig:
Je tiež možné deklarovať niekoľko mapovaní CORS s prispôsobenými vlastnosťami:
4. CORS s pružinovou bezpečnosťou
Ak v našom projekte použijeme Jarnú bezpečnosť, musíme urobiť ďalší krok, aby sme zaistili, že bude dobre hrať s CORS. Je to preto, lebo najskôr sa musí spracovať CORS. V opačnom prípade Spring Security zamietne žiadosť skôr, ako sa dostane na jar MVC.
Našťastie poskytuje Spring Security out-of-the-box riešenie:
Verejná trieda @EnableWebSecurity WebSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (HttpSecurity http) vyvolá výnimku {http.cors (). A () ...}}
Tento článok to vysvetľuje podrobnejšie.
5. Ako to funguje
Požiadavky CORS sa automaticky odosielajú rôznym registrovaným HandlerMappings. Vybavujú požiadavky na pred výstupom CORS a zachytávajú jednoduché a skutočné požiadavky CORS pomocou a CorsProcessor implementácia (DefaultCorsProcessor v predvolenom nastavení) pridať príslušné hlavičky odpovedí CORS (napr Access-Control-Allow-Origin).
CorsConfiguration umožňuje nám určiť, ako by sa mali spracovávať požiadavky CORS: okrem iného povolený pôvod, hlavičky a metódy. Môžeme ju poskytnúť rôznymi spôsobmi:
- AbstractHandlerMapping # setCorsConfiguration () umožňuje človeku určiť a Mapa s niekoľkými CorsConfigurations mapované na vzory ciest, ako sú / api / **
- Podtriedy môžu poskytovať svoje vlastné CorsConfiguration zrušením AbstractHandlerMapping # getCorsConfiguration (Object, HttpServletRequest) metóda
- Prevádzkovatelia môžu implementovať CorsConfigurationSource rozhranie (ako ResourceHttpRequestHandler teraz robí) poskytnúť a CorsConfiguration pre každú požiadavku
6. Záver
V tomto článku sme si ukázali, ako Spring poskytuje podporu pre povolenie CORS v našej aplikácii.
Začali sme konfiguráciou ovládača. Videli sme, že stačí pridať anotáciu @CrossOrigin povoliť CORS buď pre jednu konkrétnu metódu, alebo pre celý radič.
Nakoniec sme tiež videli, že ak chceme ovládať konfiguráciu CORS mimo ovládačov, môžeme to v konfiguračných súboroch vykonať hladko - buď pomocou JavaConfig alebo XML.
Celý zdrojový kód príkladov je k dispozícii na GitHub.