クロスオリジンリソースシェアリング(CORS)とは– Java Jersey Webサーバーに追加する方法は?
公開: 2014-07-19 client-server
通信中にこのエラーを修正するにはどうすればよいですか? サーバーはJSONまたはXML形式でデータを送信し、クライアントは以下の例外をスローします。
1 2 3 |
XMLHttpRequest cannot load https : //crunchify.com/api/test. No 'Access-Control-Allow-Origin' header is present on the requested resource . Origin 'null' is therefore not allowed access . |
通常のWebページはXMLHttpRequestオブジェクトを使用してリモートサーバーとデータを送受信できますが、同一生成元ポリシーによって制限されます。 拡張機能はそれほど制限されていません。 拡張機能は、最初にクロスオリジン権限を要求する限り、オリジン外のリモートサーバーと通信できます。
また、以下の質問がある場合は、正しい場所にいます。
- クロスオリジンリソースシェアリング(CORSフィルター)について
- クロスオリジンリソースシェアリングを使用できますか
- クロスオリジンリソースシェアリングを有効にする方法
- クロスオリジンリソースシェアリングを使用したクロスドメインAjaxとは
- HTTPアクセス制御(CORS)とは
CORS(Cross Origin Resource Sharing)は、Webブラウザでクロスオリジンリクエストを有効にするためにW3Cでサポートされているメカニズムです。 CORSが機能するには、ブラウザとサーバーの両方からのサポートが必要です。 これは、ApacheTomcatやその他の組み込みWebサーバーなどのWebコンテナー用のサーバー側CORSのJavaJerseyWebサーバーフィルター実装です。
ステップ1:
応答には、リソースのコンテンツへのアクセスを許可するために、リクエストの発信元を値として持つAccess-Control-Allow-Originヘッダーを含めることができます。 ユーザーエージェントは、リクエストの発信元の値と発信元が一致することを検証します。
ステップ2:
ユーザーエージェントは、プリフライトリクエストを介して、クロスオリジンリソースが特定のオリジンからの非単純な方法を使用してリクエストを受け入れる準備ができているかどうかを検出できます。 これは、ユーザーエージェントによって再度検証されます。
ステップ-3:
サーバー側アプリケーションは、HTTPリクエストが、Originヘッダーを介して、ユーザーエージェントによってクロスオリジンリクエストと見なされたことを検出できます。 この拡張機能により、サーバー側のアプリケーションは、サービスを提供するクロスオリジンリクエストに制限を適用できます(たとえば、何も返さない)。
それでは、例から始めましょう。
例-1:Java JerseyWebサーバー
数週間前、Javaアプリケーションの起動中に組み込みHTTPジャージーサーバーを起動する方法に関する記事を書きました。 この投稿では、同じジャージーサーバーにCORSフィルターを追加する方法について説明します。
ContainerResponseFilterを拡張する必要があります。 コンテナー応答フィルターによって実装されるインターフェース。 デフォルトでは、つまり、フィルター実装クラスに名前バインディングが適用されていない場合、フィルターインスタンスはすべての発信応答にグローバルに適用されます。
これを修正するために、サーバーの応答に以下の4つのヘッダーを追加してみましょう。
- Access-Control-Allow-Origin
- Access-Control-Allow-Methods
- アクセス制御-最大年齢
- Access-Control-Allow-Headers
CORSフィルターコード:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com . crunchify . tutorial ; /** * * @author Crunchify.com */ import com . sun . jersey . spi . container . ContainerRequest ; import com . sun . jersey . spi . container . ContainerResponse ; import com . sun . jersey . spi . container . ContainerResponseFilter ; import javax . ws . rs . core . Response ; import javax . ws . rs . core . Response . ResponseBuilder ; public class CrunchifyCORSFilter implements ContainerResponseFilter { public ContainerResponse filter ( ContainerRequest req , ContainerResponse crunchifyContainerResponse ) { ResponseBuilder crunchifyResponseBuilder = Response . fromResponse ( crunchifyContainerResponse . getResponse ( ) ) ; // *(allow from all servers) OR https://crunchify.com/ OR http://example.com/ crunchifyResponseBuilder . header ( "Access-Control-Allow-Origin" , "https://crunchify.com/" ) // As a part of the response to a request, which HTTP methods can be used during the actual request. . header ( "Access-Control-Allow-Methods" , "API, CRUNCHIFYGET, GET, POST, PUT, UPDATE, OPTIONS" ) // How long the results of a request can be cached in a result cache. . header ( "Access-Control-Max-Age" , "151200" ) // As part of the response to a request, which HTTP headers can be used during the actual request. . header ( "Access-Control-Allow-Headers" , "x-requested-with,Content-Type" ) ; String crunchifyRequestHeader = req . getHeaderValue ( "Access-Control-Request-Headers" ) ; if ( null ! = crunchifyRequestHeader && !crunchifyRequestHeader.equals(null)) { crunchifyResponseBuilder.header("Access-Control-Allow-Headers", crunchifyRequestHeader); } crunchifyContainerResponse . setResponse ( crunchifyResponseBuilder . build ( ) ) ; return crunchifyContainerResponse ; } } |
前のチュートリアルからのJerseyEmbeddedHTTPServerCrunchify.javaの変更。

createHttpServer()に以下の行を追加して、サーバーを再起動します。
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
結果:
http:// localhost:8085 / api
ヘッダーの詳細は次のとおりです。
例2:ApacheHTTPサーバー
ヘッダーを公開するには、<Directory>、<Location>、<Files>セクション内、または.htaccess
ファイル内に次の行を追加します。
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
例-3:.NETサーバーはこれをweb.configで次のように構成できます
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
例-4:桟橋の場合(7以上)
jetty-servletsJARをWEB-INF / libに含め、これをWEB-INF /web.xmlにマージします
1 2 3 4 5 6 7 8 |
< filter > < filter - name > cross - origin < / filter - name > < filter - class > org . eclipse . jetty . servlets . CrossOriginFilter < / filter - class > < / filter > < filter - mapping > < filter - name > cross - origin < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
例-5:Apache Tomcatサーバー(v 7.0.41 +)
1 2 3 4 5 6 7 8 |
< filter > < filter - name > CorsFilter < / filter - name > < filter - class > org . apache . catalina . filters . CorsFilter < / filter - class > < / filter > < filter - mapping > < filter - name > CorsFilter < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
例-6:PHPの場合
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
ご不明な点がございましたら、お気軽にお問い合わせください。 すべてのJavaチュートリアルのリストはここにあります。