CORS in JAX-RS

1. Overzicht

In dit korte artikel leren we hoe u CORS (Cross-Origin delen van bronnen) in een JAX-RS gebaseerd systeem. Daar bovenop zetten we een applicatie op JAX-RS in staat te stellen CORS mechanisme.

2. Hoe het CORS-mechanisme in te schakelen

Er zijn twee manieren waarop we CORS in JAX-RS kunnen inschakelen. De eerste en meest eenvoudige manier is om een ​​filter te maken om de benodigde responsheader tijdens runtime in elk verzoek te injecteren. De andere is om handmatig een geschikte koptekst toe te voegen aan elk URL-eindpunt.

Idealiter zou de eerste oplossing moeten worden gebruikt; Als dat echter geen optie is, is de meer handmatige optie ook technisch in orde.

2.1. Het filter gebruiken

JAX-RS heeft de ContainerResponseFilter interface - geïmplementeerd door de containerresponsfilters. Deze filterinstantie wordt doorgaans algemeen toegepast op elke HTTP-reactie.

We zullen deze interface implementeren om een ​​aangepast filter te maken dat wordt geïnjecteerd Toegangscontrole-toestaan- * header naar elk uitgaand verzoek en schakel de CORS mechanisme:

@Provider public class CorsFilter implementeert ContainerResponseFilter {@Override public void filter (ContainerRequestContext requestContext, ContainerResponseContext responseContext) gooit IOException {responseContext.getHeaders (). Add ("Access-Control-Allow-Origin", "*"); responseContext.getHeaders (). add ("Access-Control-Allow-Credentials", "true"); responseContext.getHeaders (). add ("Access-Control-Allow-Headers", "oorsprong, inhoudstype, accepteren, autorisatie"); responseContext.getHeaders (). add ("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); }}

Een paar punten hier:

  • Filters die ContainerResponseFilter moet expliciet worden geannoteerd met @Provider om ontdekt te worden door de JAX-RS-runtime
  • We injecteren ‘Toegangscontrole-toestaan- *‘Header met‘ * ', dat betekent dat alle URL-eindpunten naar deze serverinstantie toegankelijk zijn via elk domein; als we de domeinoverschrijdende toegang expliciet willen beperken, moeten we dat domein in deze header vermelden

2.2. Gebruik van koptekstaanpassing in elk eindpunt

Zoals eerder vermeld, kunnen we expliciet de ‘Toegangscontrole-toestaan- *‘Header ook op eindpuntniveau:

@GET @Path ("/") @Produces ({MediaType.TEXT_PLAIN}) openbare responsindex () {return Response .status (200) .header ("Access-Control-Allow-Origin", "*") .header ("Access-Control-Allow-Credentials", "true") .header ("Access-Control-Allow-Headers", "oorsprong, inhoudstype, accepteren, autorisatie") .header ("Access-Control-Allow- Methods "," GET, POST, PUT, DELETE, OPTIONS, HEAD ") .entity (" ") .build (); }

Een punt om op te merken is of we proberen in te schakelen CORS in een grote applicatie moeten we deze methode niet proberen, omdat we in dit geval de header handmatig in elk URL-eindpunt moeten injecteren, wat extra overhead zal introduceren.

Deze techniek kan echter worden gebruikt in toepassingen, waar we moeten inschakelen CORS in slechts enkele van de URL-eindpunten.

3. Testen

Zodra de applicatie is opgestart, kunnen we de headers testen met behulp van de curl-opdrachten. De uitvoer van een voorbeeldkop zou er ongeveer zo uit moeten zien:

HTTP / 1.1 200 OK Datum: di, 13 mei 2014 12:30:00 GMT Verbinding: keep-alive Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: origin , content-type, accept, autorisatie Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, HEAD Transfer-Encoding: chunked

Bovendien kunnen we een eenvoudige AJAX-functie maken en de domeinoverschrijdende functionaliteit controleren:

functieaanroep (url, type, data) {var request = $ .ajax ({url: url, methode: "GET", data: (data)? JSON.stringify (data): "", dataType: type}); request.done (functie (resp) {console.log (resp);}); request.fail (function (jqXHR, textStatus) {console.log ("Verzoek mislukt:" + textStatus);}); };

Om de controle daadwerkelijk uit te voeren, moeten we dit natuurlijk op een andere oorsprong uitvoeren dan de API die we gebruiken.

U kunt dat vrij eenvoudig lokaal doen door een client-app op een aparte poort uit te voeren - aangezien de poort de oorsprong bepaalt.

4. Conclusie

In dit artikel hebben we laten zien hoe u kunt implementeren CORS mechanisme in op JAX-RS gebaseerde applicaties.

Zoals altijd is de volledige broncode beschikbaar op GitHub.