CORS i JAX-RS

1. Oversigt

I denne hurtige artikel lærer vi om, hvordan du aktiverer CORS (Deling af ressourcer på tværs af oprindelse) i en JAX-RS baseret system. Vi opretter en applikation oven på JAX-RS at muliggøre CORS mekanisme.

2. Sådan aktiveres CORS-mekanismen

Der er to måder, hvorpå vi kan aktivere CORS i JAX-RS. Den første og mest grundlæggende måde er at oprette et filter til at indsprøjte den nødvendige svaroverskrift ved kørselstid i hver anmodning. Den anden er at manuelt tilføje en passende overskrift i hvert URL-slutpunkt.

Ideelt set bør den første løsning anvendes; Men når det ikke er en mulighed, er den mere manuelle mulighed også teknisk OK.

2.1. Brug af filteret

JAX-RS har ContainerResponseFilter interface - implementeret af containersvarefiltre. Typisk anvendes denne filterinstans globalt på ethvert HTTP-svar.

Vi implementerer denne grænseflade for at oprette et brugerdefineret filter, der indsprøjtes Adgangskontrol-tillad- * header til hver udgående anmodning og aktiver CORS mekanisme:

@Provider offentlig klasse CorsFilter implementerer ContainerResponseFilter {@Override public void filter (ContainerRequestContext requestContext, ContainerResponseContext responseContext) kaster IOException {responsContext.getHeaders (). Tilføj ("Access-Control-Allow-Origin", "*) responseContext.getHeaders (). tilføj ("Access-Control-Allow-Credentials", "true"); responseContext.getHeaders (). tilføj ("Access-Control-Allow-Headers", "oprindelse, indholdstype, accept, godkendelse"); responseContext.getHeaders (). tilføj ("Access-Control-Allow-Methods", "FÅ, POST, PUT, SLET, OPTIONS, HEAD"); }}

Et par punkter her:

  • Filtre, der implementeres ContainerResponseFilter skal eksplicit kommenteres med @Udbyder at blive opdaget af JAX-RS runtime
  • Vi injicerer 'Adgangskontrol-tillad- *'Header med' * ', det betyder, at alle URL-slutpunkter til denne serverforekomst kan tilgås via ethvert domæne; hvis vi udtrykkeligt vil begrænse adgangen på tværs af domæner, skal vi nævne dette domæne i denne overskrift

2.2. Brug af Header Modification i hvert slutpunkt

Som tidligere nævnt kan vi eksplicit injicere 'Adgangskontrol-tillad- *'Header også på slutpunktsniveauet:

@GET @Path ("/") @Produces ({MediaType.TEXT_PLAIN}) public Response index () {return Response .status (200) .header ("Access-Control-Allow-Origin", "*") .header ("Access-Control-Allow-Credentials", "true") .header ("Access-Control-Allow-Headers", "origin, content-type, accept, authorization") .header ("Access-Control-Allow- Metoder "," FÅ, POST, PUT, SLET, INDSTILLINGER, HOVED ") .entity (" ") .build (); }

Et punkt at bemærke her er, hvis vi prøver at aktivere CORS i en stor applikation, bør vi ikke prøve denne metode, fordi vi i dette tilfælde er nødt til manuelt at injicere overskriften i alle URL-slutpunkter, som vil introducere yderligere omkostninger.

Denne teknik kan dog bruges i applikationer, hvor vi skal aktivere CORS kun i nogle af URL-slutpunkterne.

3. Testning

Når applikationen er afsluttet, kan vi teste overskrifterne ved hjælp af curl-kommandoerne. Et eksempel på headere-output skal være noget som nedenfor:

HTTP / 1.1 200 OK Dato: Tir, 13. maj 2014 12:30:00 GMT Forbindelse: hold-i live Adgangskontrol-Tillad oprindelse: * Adgangskontrol-Tillad-legitimationsoplysninger: ægte adgangskontrol-Tillad-overskrifter: oprindelse , indholdstype, acceptere, autorisation Adgangskontrol-Tillad-metoder: FÅ, POST, PUT, SLET, INDSTILLINGER, HEAD Overførsel-kodning: klumpet

Hvad mere er, kan vi oprette en simpel AJAX-funktion og kontrollere funktionerne på tværs af domæner:

funktionsopkald (url, type, data) {var anmodning = $ .ajax ({url: url, metode: "GET", data: (data)? JSON.stringify (data): "", dataType: type}); request.done (funktion (resp) {console.log (resp);}); request.fail (funktion (jqXHR, textStatus) {console.log ("Forespørgsel mislykkedes:" + textStatus);}); };

Selvfølgelig for at faktisk udføre kontrollen bliver vi nødt til at køre dette på en anden oprindelse end den API, vi bruger.

Du kan gøre det lokalt ganske let ved at køre en klientapp på en separat port - da havnen bestemmer oprindelsen.

4. Konklusion

I denne artikel viste vi os om implementering CORS mekanisme i JAX-RS-baserede applikationer.

Som altid er den fulde kildekode tilgængelig på GitHub.


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