CORS in JAX-RS

1. Übersicht

In diesem kurzen Artikel erfahren Sie, wie Sie CORS ( Cross-Origin Resource Sharing ) in einem JAX-RS- basierten System aktivieren . Wir werden eine Anwendung auf JAX-RS einrichten , um den CORS- Mechanismus zu aktivieren .

2. Aktivieren des CORS-Mechanismus

Es gibt zwei Möglichkeiten, wie wir CORS in JAX-RS aktivieren können. Der erste und grundlegendste Weg besteht darin, einen Filter zu erstellen, um den erforderlichen Antwortheader zur Laufzeit in jede Anforderung einzufügen. Die andere Möglichkeit besteht darin, jedem URL-Endpunkt manuell einen entsprechenden Header hinzuzufügen.

Idealerweise sollte die erste Lösung verwendet werden. Wenn dies jedoch keine Option ist, ist die manuellere Option auch technisch in Ordnung.

2.1. Verwenden des Filters

JAX-RS verfügt über die ContainerResponseFilter- Schnittstelle, die von den Containerantwortfiltern implementiert wird. In der Regel wird diese Filterinstanz global auf jede HTTP-Antwort angewendet.

Wir werden diese Schnittstelle implementieren, um einen benutzerdefinierten Filter zu erstellen, der den Access-Control-Allow- * -Header in jede ausgehende Anforderung einfügt und den CORS- Mechanismus aktiviert :

@Provider public class CorsFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { responseContext.getHeaders().add( "Access-Control-Allow-Origin", "*"); responseContext.getHeaders().add( "Access-Control-Allow-Credentials", "true"); responseContext.getHeaders().add( "Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); responseContext.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); } }

Ein paar Punkte hier:

  • Filter, die ContainerResponseFilter implementieren, müssen explizit mit @Provider versehen sein , damit sie von der JAX-RS-Laufzeit erkannt werden
  • Wir fügen den Header ' Access-Control-Allow- * ' mit '*' ein. Dies bedeutet, dass auf alle URL-Endpunkte dieser Serverinstanz über eine beliebige Domäne zugegriffen werden kann. Wenn wir den domänenübergreifenden Zugriff explizit einschränken möchten, müssen wir diese Domäne in diesem Header erwähnen

2.2. Verwenden der Header-Änderung für jeden Endpunkt

Wie bereits erwähnt, können wir den Header ' Access-Control-Allow- * ' auch auf Endpunktebene explizit einfügen :

@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-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD") .entity("") .build(); }

Wenn Sie versuchen, CORS in einer großen Anwendung zu aktivieren , sollten Sie diese Methode nicht ausprobieren, da wir in diesem Fall den Header manuell in alle URL-Endpunkte einfügen müssen, wodurch zusätzlicher Overhead entsteht.

Diese Technik kann jedoch in Anwendungen verwendet werden, in denen CORS nur in einigen URL-Endpunkten aktiviert werden muss .

3. Testen

Sobald die Anwendung aktiv ist, können wir die Header mit den Curl-Befehlen testen. Die Ausgabe eines Beispiel-Headers sollte wie folgt aussehen:

HTTP/1.1 200 OK Date : Tue, 13 May 2014 12:30:00 GMT Connection : keep-alive Access-Control-Allow-Origin : * Access-Control-Allow-Credentials : true Access-Control-Allow-Headers : origin, content-type, accept, authorization Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS, HEAD Transfer-Encoding : chunked

Darüber hinaus können wir eine einfache AJAX-Funktion erstellen und die domänenübergreifende Funktionalität überprüfen:

function call(url, type, data) { var request = $.ajax({ url: url, method: "GET", data: (data) ? JSON.stringify(data) : "", dataType: type }); request.done(function(resp) { console.log(resp); }); request.fail(function(jqXHR, textStatus) { console.log("Request failed: " + textStatus); }); };

Um die Prüfung tatsächlich durchführen zu können, müssen wir dies natürlich auf einem anderen Ursprung als der von uns verwendeten API ausführen.

Sie können dies ganz einfach lokal tun, indem Sie eine Client-App auf einem separaten Port ausführen - da der Port den Ursprung bestimmt.

4. Fazit

In diesem Artikel haben wir die Implementierung des CORS- Mechanismus in JAX-RS-basierten Anwendungen gezeigt.

Wie immer ist der vollständige Quellcode auf GitHub verfügbar.