2015-09-10 19 views
10

私は公開のREST APIを作るために遊び2.4を使用しています。私はすべての起源とヘッダーを許可するCORSフィルタを追加しました。再生! 2.4:元のファイルからCORSを許可する方法://

はapplication.confから参照してください:

play.filters { 
    # CORS filter configuration 
    cors { 

    # The path prefixes to filter. 
    pathPrefixes = ["/"] 

    # The allowed origins. If null, all origins are allowed. 
    allowedOrigins = null 

    # The allowed HTTP methods. If null, all methods are allowed 
    allowedHttpMethods = null 

    # The allowed HTTP headers. If null, all headers are allowed. 
    allowedHttpHeaders = null 

    # The exposed headers 
    exposedHeaders = [] 

    # Whether to support credentials 
    supportsCredentials = true 

    # The maximum amount of time the CORS meta data should be cached by the client 
    preflightMaxAge = 1 hour 
    } 
} 

私は古典的なブラウザ(クローム/ Firefoxがテストした)からAPIを呼び出すときに、私はすべて許可されてそれは関係なく、起源の、完全に正常に動作します。

しかし、私がコードバアプリケーション(cordovaアプリケーションでは、ajaxリクエストの起点はfile://)を呼び出すと、CORSエラー:No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'file://' is therefore not allowed access. The response had HTTP status code 403が発生します。あたかも私が原点を許可しなかったかのようにファイル:// '

私はCORS(GET https://public.opencpu.org/ocpu/library/)が要求をブロックしたコーダバーではないかどうかをチェックすることができますが、うまくいきました。だから問題はPlayから来ていると思います。 ...

すべてのヘルプしてください

私は allowedOrigins = ["file://"]を設定しようとしましたが、それはどちらか動作しませんか?

EDIT:これはCross origin GET from local file://の複製ではありません。ウェブサーバーはコーデックアプリケーションであるため、インストールできません。これらのファイルは、電話/タブレットファイルシステムからWebViewに提供されます。 これはPlayフレームワーク固有の質問です。以前のバージョンでは問題はありませんでした。おそらくデフォルトのCorsFilterは、原点ファイルを許可するように変更することができます://

EDIT 2:要求された後、私のカスタムスカラフィルタに使用する(非常に単純な)コードです。

私はこれを開発モードでのみ使用しており、いくつかの問題があることに注意してください。たとえば、実行時に例外がキャッチされない場合、フィルタは適用されないため、応答にはCORSヘッダーはありません。しかし、これがコードバアプリケーションのためのものなら、十分にうまくいくはずです。

+0

コードバスの実装コードはどのように見えますか? – Justin

+1

こんにちは、これは以下の複製です:http://stackoverflow.com/questions/8192159/cross-origin-get-from-local-file – Saar

+0

@Saar私はあなたのためにそれを示しました:) –

答えて

10

[OK]を、問題がプレイ枠組みの中でのコード行から来ている:https://github.com/playframework/playframework/blob/master/framework/src/play-filters-helpers/src/main/scala/play/filters/cors/AbstractCORSPolicy.scala#L322

URIが「ファイル://」であるとして、URIのドメイン/ホストがnullであるのでnew URIがエラーをスローし、 Playは403エラーを返します。これを修正するには、フレームワークにパッチを当てるか、原点を 'file://'に変更する必要があります。

私のユースケースの回避策を見つけました:再生時にCORSを無効にしてください。私がコードバのアプリからajaxを使用すると、起点はチェックされません。

この回避策の問題は、何らかの理由でPlayプロジェクトでCORSを有効にする場合、Playが原点をチェックして拒否するため、コードバアプリケーションが機能しなくなることです。

+0

追跡するためにhttps://github.com/playframework/playframework/issues/5193を作成しました。 –

+0

CORSをどのように無効にするか説明してください。 – Simon

+1

私は再生フィルタ[CorsFilter](https://www.playframework.com/documentation/2.4.x/CorsFilter)を有効にしました。私のコードバのアプリが動作するためにそれを必要としなかったとき、私はただそれを削除しました。 問題は、私がコードブラウザのアプリケーションをブラウザでテストした場合、クロムのクロスドメインセキュリティを無効にしなかった場合、CORSエラーが発生することです。だから後で私は自分のCORSFilterを作って、チェックなしですべてのリクエストに必要なヘッダーを追加しました。 – SebT

関連する問題