CORS i JAX-RS

1. Oversikt

I denne raske artikkelen vil vi lære om hvordan du aktiverer CORS (Ressursdeling på tvers av opprinnelse) i en JAX-RS basert system. Vi setter opp en applikasjon på toppen av JAX-RS å aktivere CORS mekanisme.

2. Hvordan aktivere CORS-mekanismen

Det er to måter vi kan aktivere CORS på JAX-RS. Den første og mest grunnleggende måten er å lage et filter for å injisere nødvendig svarhode ved kjøretid i hver forespørsel. Den andre er å manuelt legge til en passende overskrift i hvert URL-sluttpunkt.

Ideelt sett bør den første løsningen brukes; Men når det ikke er et alternativ, er det mer manuelle alternativet også teknisk OK.

2.1. Bruke filteret

JAX-RS har ContainerResponseFilter grensesnitt - implementert av containerens responsfilter. Vanligvis brukes denne filterforekomsten globalt på ethvert HTTP-svar.

Vi implementerer dette grensesnittet for å lage et tilpasset filter som vil injisere Tilgangskontroll-Tillat- * topptekst til hver utgående forespørsel og aktiver CORS mekanisme:

@Provider offentlig klasse CorsFilter implementerer ContainerResponseFilter {@Override public void filter (ContainerRequestContext requestContext, ContainerResponseContext responseContext) kaster IOException {responsContext.getHeaders (). Add ("Access-Control-Allow-Origin", "*) responseContext.getHeaders (). add ("Access-Control-Allow-Credentials", "true"); responseContext.getHeaders (). legg til ("Access-Control-Allow-Headers", "opprinnelse, innholdstype, godta, autorisasjon"); responseContext.getHeaders (). legg til ("Access-Control-Allow-Methods", "GET, POST, PUT, SLETT, ALTERNATIVER, HEAD"); }}

Et par poeng her:

  • Filtre som implementeres ContainerResponseFilter må eksplisitt kommenteres med @Forsørger å bli oppdaget av JAX-RS kjøretid
  • Vi injiserer ‘Tilgangskontroll-Tillat- *‘Topptekst med‘ * ’, det betyr at alle URL-sluttpunkter til denne serverforekomsten kan nås via hvilket som helst domene; hvis vi vil begrense tilgangen på tvers av domener eksplisitt, må vi nevne det domenet i denne overskriften

2.2. Bruke toppmodifikasjon i hvert sluttpunkt

Som nevnt tidligere, kan vi eksplisitt injisereTilgangskontroll-Tillat- *‘Topptekst på endepunktnivå også:

@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, SLETT, ALTERNATIVER, HODE ") .entity (" ") .build (); }

Et poeng å merke seg her er hvis vi prøver å aktivere CORS i et stort program, bør vi ikke prøve denne metoden fordi i dette tilfellet må vi manuelt injisere overskriften i alle URL-endepunkter som vil introdusere ekstra overhead.

Imidlertid kan denne teknikken brukes i applikasjoner, der vi trenger å aktivere CORS bare i noen av URL-endepunktene.

3. Testing

Når applikasjonen er oppe, kan vi teste topptekstene ved hjelp av krøllkommandoene. Et eksempel på overskrifter skal være omtrent som nedenfor:

HTTP / 1.1 200 OK Dato: Tirsdag 13. mai 2014 12:30:00 GMT Tilkobling: hold-i live Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: origin , innholdstype, godta, autorisasjon Access-Control-Allow-Methods: GET, POST, PUT, DELETE, ALTERNATIVER, HEAD Transfer-Enoding: chunked

I tillegg kan vi opprette en enkel AJAX-funksjon og sjekke funksjonen på tvers av domener:

funksjonsanrop (url, type, data) {var forespørsel = $ .ajax ({url: url, metode: "GET", data: (data)? JSON.stringify (data): "", dataType: type}); request.done (funksjon (resp) {console.log (resp);}); request.fail (funksjon (jqXHR, textStatus) {console.log ("Forespørsel mislyktes:" + textStatus);}); };

Selvfølgelig, for å faktisk utføre kontrollen, må vi kjøre dette på en annen opprinnelse enn APIen vi bruker.

Du kan gjøre det ganske enkelt ved å kjøre en klientapp på en egen port - siden havnen bestemmer opprinnelsen.

4. Konklusjon

I denne artikkelen viste vi om implementering CORS mekanisme i JAX-RS-baserte applikasjoner.

Som alltid er hele kildekoden tilgjengelig på GitHub.


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