CORS med forår

1. Oversigt

I enhver moderne browser er CORS (Cross-Origin Resource Sharing) en relevant specifikation med fremkomsten af ​​HTML5- og JS-klienter, der bruger data via REST API'er.

I mange tilfælde er værten, der betjener JS (f.eks. eksempel.com) er forskellig fra den vært, der betjener dataene (f.eks. api.example.com). I et sådant tilfælde muliggør CORS kommunikation på tværs af domæner.

Spring leverer førsteklasses support til CORS og tilbyder en nem og kraftfuld måde at konfigurere den i enhver Spring- eller Spring Boot-webapplikation.

2. Controller-metode CORS-konfiguration

Aktivering af CORS er ligetil - bare tilføj kommentaren @CrossOrigin.

Vi kan implementere dette på flere forskellige måder.

2.1. @CrossOrigin på en @ RequestMapping-Annoteret håndteringsmetode

@RestController @RequestMapping ("/ account") public class AccountController {@CrossOrigin @RequestMapping (method = RequestMethod.GET, path = "/ {id}") offentlig konto hente (@PathVariable Long id) {// ...} @RequestMapping (metode = RequestMethod.DELETE, sti = "/ {id}") offentlig ugyldig fjernelse (@PathVariable Lang id) {// ...}}

I eksemplet ovenfor aktiverede vi kun CORS til hente () metode. Vi kan se, at vi ikke har indstillet nogen konfiguration til @CrossOrigin kommentar, så den bruger standardindstillingerne:

  • Al oprindelse er tilladt
  • De tilladte HTTP-metoder er dem, der er specificeret i @RequestMapping annotation (for dette eksempel er GET)
  • Det tidspunkt, hvor preflight-svaret cachelagres (maxAge) er 30 minutter

2.2. @CrossOrigin på controlleren

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

Denne gang tilføjede vi @CrossOrigin på klasseniveau. Derfor begge hente () og fjerne() metoder har det aktiveret. Vi kan tilpasse konfigurationen ved at angive værdien for en af ​​annotationsattributterne: oprindelse, metoder, tilladt Headers, eksponeret overhoveder, tilladelsesoplysninger, 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 kombinerer attributter fra begge kommentarer for at oprette en flettet CORS-konfiguration.

I dette eksempel vil begge metoder have en maxAlder på 3600 sekunder, metoden fjerne() vil tillade alle oprindelser, men metoden hente () tillader kun oprindelse fra //eksempel.com.

3. Global CORS-konfiguration

Som et alternativ til den finkornede annotationsbaserede konfiguration giver Spring os mulighed for at definere en global CORS-konfiguration ud af dine controllere. Dette svarer til at bruge en Filter baseret løsning, men kan deklareres inden for foråret MVC og kombineres med finkornet @CrossOrigin konfiguration.

Som standard er alle oprindelsesmetoder og GET, HEAD og POST-metoder tilladt.

3.1. JavaConfig

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

Eksemplet ovenfor muliggør CORS-anmodninger fra enhver oprindelse til ethvert slutpunkt i applikationen.

Hvis vi vil låse dette lidt mere ned, er registry.addMapping metode returnerer a CorsRegistration objekt, som vi kan bruge til yderligere konfiguration. Der er også en tilladtOriginer metode, der lader os specificere en matrix med tilladte oprindelser. Dette kan være nyttigt, hvis vi har brug for at indlæse denne matrix fra en ekstern kilde ved kørsel.

Derudover er der også tilladt metoder, tilladt Headers, eksponeret overhoveder, maxAlderog tilladelsesoplysninger som vi kan bruge til at indstille svarets overskrifter og tilpasningsmuligheder.

3.2. XML-navneområde

Denne minimale XML-konfiguration muliggør CORS på en /** stingmønster med de samme standardegenskaber som JavaConfig:

Det er også muligt at erklære flere CORS-kortlægninger med tilpassede egenskaber:

4. CORS med Spring Security

Hvis vi bruger Spring Security i vores projekt, skal vi tage et ekstra skridt for at sikre, at det spiller godt med CORS. Det er fordi CORS skal behandles først. Ellers afviser Spring Security anmodningen, inden den når Spring MVC.

Heldigvis giver Spring Security en out-of-the-box løsning:

@EnableWebSecurity offentlig klasse WebSecurityConfig udvider WebSecurityConfigurerAdapter {@ Override-beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http.cors (). Og () ...}}

Denne artikel forklarer det mere detaljeret.

5. Sådan fungerer det

CORS-anmodninger sendes automatisk til de forskellige registrerede HandlerMappings. De håndterer CORS preflight-anmodninger og opfanger CORS simple og faktiske anmodninger ved hjælp af en CorsProcessor implementering (DefaultCorsProcessor som standard) for at tilføje de relevante CORS-svaroverskrifter (f.eks Adgangskontrol-Tillad oprindelse).

CorsConfiguration giver os mulighed for at specificere, hvordan CORS-anmodningerne skal behandles: tilladte oprindelser, overskrifter og metoder, blandt andre. Vi kan levere det på forskellige måder:

  • AbstractHandlerMapping # setCorsConfiguration () tillader en at specificere en Kort med flere CorsConfigurations kortlagt på sti- mønstre som f.eks / api / **
  • Underklasser kan give deres egne CorsConfiguration ved at tilsidesætte AbstractHandlerMapping # getCorsConfiguration (Object, HttpServletRequest) metode
  • Handlere kan implementere CorsConfigurationSource interface (som ResourceHttpRequestHandler gør nu) for at give en CorsConfiguration for hver anmodning

6. Konklusion

I denne artikel viste vi, hvordan Spring yder støtte til aktivering af CORS i vores applikation.

Vi startede med konfigurationen af ​​controlleren. Vi så, at vi kun behøver at tilføje kommentaren @CrossOrigin for at aktivere CORS enten til en bestemt metode eller hele controlleren.

Endelig så vi også, at hvis vi vil kontrollere CORS-konfigurationen uden for controllerne, kan vi udføre dette problemfrit i konfigurationsfilerne - enten ved hjælp af JavaConfig eller XML.

Den fulde kildekode til eksemplerne er tilgængelig på GitHub.