13

他のドメインでホストされている Javascript を使用して呼び出したい Play 2.0.1 アプリケーションがあります。私のJavascript呼び出しは次のように失敗しています:

Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.

Play 1 で正しい HTTP ヘッダーを設定する方法の例をいくつか見つけましたが、Play 2.0.1 では何も見つかりませんでした。ドキュメント (http://www.playframework.org/documentation/2.0.2/JavaResponse) を読んだ後、動作させるために次のことを試しました。

public static Result myJsonWebService() {
  ...
  response().setHeader("Access-Control-Allow-Origin", "*");
  return ok(toJson(jsonObject));
}

しかし、私の JS Web サービス呼び出しはまだ失敗しています。

これを機能させるにはどうすればよいですか?

4

4 に答える 4

11

ここにいくつかの背景情報があります...

  • 1) http://www.html5rocks.com/en/tutorials/cors/ - JSON はこのカテゴリに分類されるため、「それほど単純ではないリクエスト」について少し読む必要があることに注意してください。
  • 2) http://stackoverflow.com/questions/9613210/cors-access-control-allow-origin-despite-correct-headers?rq=1
  • 3) http://caniuse.com/#search=cors - CORS をサポートするブラウザーの詳細
  • 4) http://stackoverflow.com/questions/10748537/access-control-allow-origin-on-playframework (再生 1 ではなく再生 2 の場合)

だからここに私が実装したものがあります:

それほど単純ではないリクエスト (上記の 1 を参照) は飛行前の呼び出しを行うため、routes ファイルに以下を追加する必要があります。

POST /url_to_json_webservice        controllers.myJsonWebServices.myJsonWebService
OPTIONS /url_to_json_webservice     controllers.myJsonWebServices.checkPreFlight

次に、コントローラーで次のメソッドを設定します。

public static Result checkPreFlight() {
    response().setHeader("Access-Control-Allow-Origin", "*");       // Need to add the correct domain in here!!
    response().setHeader("Access-Control-Allow-Methods", "POST");   // Only allow POST
    response().setHeader("Access-Control-Max-Age", "300");          // Cache response for 5 minutes
    response().setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");         // Ensure this header is also allowed!  
    return ok();
}

ここで必要以上のヘッダーを設定した可能性があることに注意してください。必要なものを確認してください!!

また、実際のJSON結果を返すコントローラーメソッドの最後に次を追加することを忘れないでください(上記の私の質問のように):

public static Result myJsonWebService() {
  ...
  response().setHeader("Access-Control-Allow-Origin", "*");
  return ok(toJson(jsonObject));
}
于 2013-01-21T10:55:10.587 に答える
3

これを行う良い方法は、アクションを拡張することです。

package actions;

import play.*;
import play.mvc.*;
import play.mvc.Http.Context;
import play.mvc.Http.Response;

public class CorsAction extends Action.Simple {

public Result call(Context context) throws Throwable{
    Response response = context.response();
    response.setHeader("Access-Control-Allow-Origin", "*");

    //Handle preflight requests
    if(context.request().method().equals("OPTIONS")) {
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Auth-Token");
        response.setHeader("Access-Control-Allow-Credentials", "true");

        return ok();
    }

    response.setHeader("Access-Control-Allow-Headers","X-Requested-With, Content-Type, X-Auth-Token");
    return delegate.call(context);
}

}

次に、コントローラーに次の行を追加します。

@With(CorsAction.class)

次に、すべての ok() リクエストが上記のヘッダーで応答します。

于 2013-09-30T08:52:02.753 に答える