CORS med vår

1. Oversikt

I enhver moderne nettleser er CORS (Cross-Origin Resource Sharing) en relevant spesifikasjon med fremveksten av HTML5- og JS-klienter som bruker data via REST API-er.

I mange tilfeller er verten som betjener JS (f.eks. eksempel.com) er forskjellig fra verten som serverer dataene (f.eks. api.example.com). I et slikt tilfelle muliggjør CORS kommunikasjon på tvers av domener.

Spring gir førsteklasses støtte for CORS, og tilbyr en enkel og kraftig måte å konfigurere den i alle Spring- eller Spring Boot-webapplikasjoner.

2. Kontrollmetode CORS-konfigurasjon

Aktivering av CORS er grei - bare legg til kommentaren @CrossOrigin.

Vi kan implementere dette på flere forskjellige måter.

2.1. @CrossOrigin på en @ RequestMapping-Annotated Handler Method

@RestController @RequestMapping ("/ account") offentlig klasse AccountController {@CrossOrigin @RequestMapping (method = RequestMethod.GET, path = "/ {id}") offentlig konto henting (@PathVariable Long id) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") public void remove (@PathVariable Long id) {// ...}}

I eksemplet ovenfor aktiverte vi bare CORS for hente() metode. Vi kan se at vi ikke har satt noen konfigurasjon for @CrossOrigin merknad, så den bruker standardinnstillingene:

  • All opprinnelse er tillatt
  • HTTP-metodene som er tillatt er de som er spesifisert i @RequestMapping kommentar (for dette eksemplet er GET)
  • Tiden som forhåndsflyresponsen er hurtigbufret (maxAge) er 30 minutter

2.2. @CrossOrigin på kontrolleren

@CrossOrigin (origins = "//example.com", maxAge = 3600) @RestController @RequestMapping ("/ account") offentlig klasse AccountController {@RequestMapping (method = RequestMethod.GET, path = "/ {id}") offentlig Hent konto (@PathVariable Long ID) {// ...} @RequestMapping (method = RequestMethod.DELETE, path = "/ {id}") offentlig ugyldig fjerning (@PathVariable Long id) {// ...}}

Denne gangen la vi til @CrossOrigin på klassenivå. Følgelig begge deler hente() og fjerne() metoder har det aktivert. Vi kan tilpasse konfigurasjonen ved å spesifisere verdien til en av merknadsattributtene: opprinnelse, metoder, allowHeaders, eksponertHeaders, tillate legitimasjon, eller maxAlder.

2.3. @CrossOrigin på Controller and Handler Method

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

Spring vil kombinere attributter fra begge kommentarene for å lage en sammenslått CORS-konfigurasjon.

I dette eksemplet vil begge metodene ha en maxAlder på 3600 sekunder, metoden fjerne() vil tillate all opprinnelse, men metoden hente() vil bare tillate opprinnelse fra //eksempel.com.

3. Global CORS-konfigurasjon

Som et alternativ til den finkornede kommentarbaserte konfigurasjonen, lar Spring oss definere noen globale CORS-konfigurasjoner ut av kontrollerne dine. Dette ligner på å bruke en Filter basert løsning, men kan deklareres innenfor våren MVC og kombineres med finkornet @CrossOrigin konfigurasjon.

Som standard er alle opprinnelser og GET, HEAD og POST-metoder tillatt.

3.1. JavaConfig

@Configuration @EnableWebMvc public class WebConfig implementerer WebMvcConfigurer {@Override public void addCorsMappings (CorsRegistry registry) {registry.addMapping ("/ **"); }}

Eksemplet ovenfor gjør det mulig for CORS-forespørsler fra hvilken som helst opprinnelse til hvilket som helst sluttpunkt i applikasjonen.

Hvis vi ønsker å låse dette litt mer, vil registry.addMapping metoden returnerer a CorsRegistration objekt, som vi kan bruke for ytterligere konfigurasjon. Det er også en tillattOriginer metode som lar oss spesifisere en rekke tillatte opprinnelser. Dette kan være nyttig hvis vi trenger å laste denne matrisen fra en ekstern kilde ved kjøretid.

I tillegg er det også tillatt Metoder, allowHeaders, eksponertHeaders, maxAlder, og tillate legitimasjon som vi kan bruke til å angi svaroverskrifter og tilpasningsalternativer.

3.2. XML-navneområde

Denne minimale XML-konfigurasjonen aktiverer CORS på en /** banemønster med de samme standardegenskapene som JavaConfig:

Det er også mulig å erklære flere CORS-tilordninger med tilpassede egenskaper:

4. CORS med vårsikkerhet

Hvis vi bruker Spring Security i prosjektet vårt, må vi ta et ekstra skritt for å sikre at det spiller bra med CORS. Det er fordi CORS må behandles først. Ellers vil Spring Security avvise forespørselen før den når Spring MVC.

Heldigvis gir Spring Security en løsning utenom boksen:

@EnableWebSecurity offentlig klasse WebSecurityConfig utvider WebSecurityConfigurerAdapter {@ Override-beskyttet ugyldig konfigurering (HttpSecurity http) kaster unntak {http.cors (). Og () ...}}

Denne artikkelen forklarer det mer detaljert.

5. Hvordan det fungerer

CORS-forespørsler sendes automatisk til de forskjellige registrerte HandlerMappings. De håndterer CORS preflight-forespørsler og fanger opp CORS enkle og faktiske forespørsler ved hjelp av en CorsProsessor gjennomføring (DefaultCorsProcessor som standard) for å legge til de aktuelle CORS-svarhodene (for eksempel Tilgangskontroll-Tillat opprinnelse).

CorsConfiguration lar oss spesifisere hvordan CORS-forespørslene skal behandles: tillatt opprinnelse, overskrifter og metoder, blant andre. Vi kan tilby det på forskjellige måter:

  • AbstractHandlerMapping # setCorsConfiguration () lar en spesifisere en Kart med flere CorsConfigurations kartlagt på banemønstre som / api / **
  • Underklasser kan gi sine egne CorsConfiguration ved å overstyre AbstractHandlerMapping # getCorsConfiguration (Object, HttpServletRequest) metode
  • Handlere kan implementere CorsConfigurationSource grensesnitt (som ResourceHttpRequestHandler gjør nå) for å gi en CorsConfiguration for hver forespørsel

6. Konklusjon

I denne artikkelen viste vi hvordan Spring gir støtte for å aktivere CORS i vår applikasjon.

Vi startet med konfigurasjonen av kontrolleren. Vi så at vi bare trenger å legge til kommentaren @CrossOrigin for å aktivere CORS enten til en bestemt metode eller hele kontrolleren.

Til slutt så vi også at hvis vi vil kontrollere CORS-konfigurasjonen utenfor kontrollerne, kan vi utføre dette jevnt i konfigurasjonsfilene - enten ved hjelp av JavaConfig eller XML.

Den fullstendige kildekoden for eksemplene er tilgjengelig på GitHub.


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