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.


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