JAX-RSのCORS

1概要

このクイック記事では、 JAX-RS ベースのシステムでhttps://en.wikipedia.org/wiki/Cross-origin resource sharing[CORS]( Cross-Origin Resource Sharing )を有効にする方法について説明します。 CORS メカニズムを有効にするために JAX-RS の上にアプリケーションを設定します。

2 CORSメカニズムを有効にする方法

JAX-RSでCORSを有効にする方法は2つあります。最初のそして最も基本的な方法はすべてのリクエストの実行時に必要なレスポンスヘッダを挿入するためのフィルタを作成することです。もう1つは、各URLエンドポイントに適切なヘッダーを手動で追加することです。

理想的には、最初の解決策を使用する必要があります。ただし、それが選択肢ではない場合は、より手動の選択肢も技術的に問題ありません。

2.1. フィルタを使う

JAX-RS にはhttps://docs.oracle.com/javaee/7/api/javax/ws/rs/container/ContainerResponseFilter.html[ ContainerResponseFilter ]インタフェースがあります - コンテナ応答フィルタによって実装されます。通常、このフィルタインスタンスはすべてのHTTP応答にグローバルに適用されます。

このインタフェースを実装して、各アクセス要求に Access-Control-Allow - ** ヘッダーを挿入し、 CORS メカニズムを有効にするカスタムフィルタを作成します。

@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");
    }
}

ここでいくつかのポイント:

  • ContainerResponseFilter を実装するフィルタは明示的に指定する必要があります

JAX-RSランタイムによって検出されるように @ Provider というアノテーションが付けられます Access-Control-Allow - 」ヘッダーに「** 」を挿入しています。

このサーバーインスタンスへのURLエンドポイントは、どのドメインからもアクセスできます。クロスドメインアクセスを明示的に制限したい場合は、このヘッダーにそのドメインを記載する必要があります。

2.2. 各エンドポイントへのヘッダー変更の使用

前述のように、エンドポイントレベルでも ' Access-Control-Allow - ** 'ヘッダーを明示的に挿入できます。

@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();
}

ここで注意しなければならないのは、大規模なアプリケーションで CORS を有効にしようとしている場合、この方法を試してはいけないということです。この場合、すべてのURLエンドポイントにヘッダーを手動で挿入する必要があります。

ただし、この手法は一部のURLエンドポイントでのみ CORS を有効にする必要があるアプリケーションで使用できます。

3テスト中

アプリケーションが起動したら、curlコマンドを使ってヘッダをテストできます。サンプルヘッダーの出力は以下のようになります。

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

さらに、単純なAJAX関数を作成してクロスドメイン機能を確認することもできます。

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);
    });
};

もちろん、実際にチェックを実行するためには、私たちが消費しているAPIとは異なる起源でこれを実行する必要があります。

クライアントアプリケーションを別のポートで実行することで、ローカルで非常に簡単にこれを実行できます。

4結論

この記事では、JAX-RSベースのアプリケーションでの CORS メカニズムの実装について説明しました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/resteasy[GitHubで利用可能]です。