1. 概要

このクイック記事では、JAX-RSベースのシステムでCORSクロスオリジンリソースシェアリング)を有効にする方法について学習します。 JAX-RS の上にアプリケーションをセットアップして、CORSメカニズムを有効にします。

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

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

理想的には、最初のソリューションを使用する必要があります。 ただし、それがオプションでない場合は、より手動のオプションでも技術的に問題ありません。

2.1. フィルタの使用

JAX-RS には、 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メカニズムを実装する方法について説明しました。

いつものように、完全なソースコードはGitHub利用できます。