CORS in JAX-RS

CORS in JAX-RS

1. Überblick

In diesem kurzen Artikel erfahren Sie, wie SieCORS (Cross-Origin Resource Sharing) in einem aufJAX-RSbasierenden System aktivieren. Wir werden eine Anwendung überJAX-RS einrichten, um den Mechanismus vonCORSzu aktivieren.

2. So aktivieren Sie den CORS-Mechanismus

Es gibt zwei Möglichkeiten, wie wir CORS in JAX-RS aktivieren können. Die erste und grundlegendste Möglichkeit besteht darin, einen Filter zu erstellen, um den erforderlichen Antwortheader zur Laufzeit in jede Anforderung einzufügen. Die andere 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 hat die SchnittstelleContainerResponseFilter - implementiert von den Container-Antwortfiltern. Normalerweise wird diese Filterinstanz global auf jede HTTP-Antwort angewendet.

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

@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, dieContainerResponseFilter implementieren, müssen explizit mit@Provider versehen werden, damit sie von der JAX-RS-Laufzeit erkannt werden

  • Wir fügen 'Access-Control-Allow-' s 'Header mit' 'ein, dh, auf alle URL-Endpunkte zu dieser Serverinstanz kann über jede Domain zugegriffen werden. 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ätzliche eingeführt werden Overhead.

Diese Technik kann jedoch in Anwendungen verwendet werden, in denenCORS nur in einigen URL-Endpunkten aktiviert werden müssen.

3. Testen

Sobald die Anwendung ausgeführt wird, können wir die Header mit den Befehlen curl testen. Die Ausgabe eines Beispiel-Headers sollte etwa 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 -since the port does determine the origin.

4. Fazit

In diesem Artikel haben wir gezeigt, wie der Mechanismus vonCORSin JAX-RS-basierten Anwendungen implementiert wird.

Wie immer ist der vollständige Quellcodeover on GitHub verfügbar.