3

Playframework 2.1 (Java) で Cross Origin Domain Sharing を有効にする方法を確認したかったのです。これを行う方法に関するドキュメントはありませんでした。

4

2 に答える 2

2

これが 2.x にどのように変換されるかはわかりませんが、1.2.5 ではこれを行います。非標準ヘッダーがある場合、Access-Control-Allow-Headers はオプションです。Allow-Origin の * を変更して、許可するドメインのみに一致させることができます。

@Before
static void CORS() {
    if(request.headers.containsKey("origin")){
        response.headers.put("Access-Control-Allow-Origin", new Header("Access-Control-Allow-Origin", "*"));
        response.headers.put("Access-Control-Allow-Headers", new Header("Access-Control-Allow-Headers", "my-custom-header, my-second-custom-header"));
    }
}

非標準メソッド (GET/POST) を使用するか、カスタム ヘッダーを使用する場合、ほとんどのユーザー エージェントはプリフライト OPTIONS 呼び出しを行うため、これをルート ファイルに追加します。

#This catches the preflight CORS calls
OPTIONS /{path}                                 Application.options

そしてこれは私のコントローラーで:

/**
 * Cross Origin Request Sharing calls are going to have a pre-flight option call because we use the "non simple headers"
 * This method catches those, (headers handling is done in the CORS() method)
 */
public static void options() {}
于 2013-02-12T14:01:38.213 に答える
2

Scala 言語を使用すると、素晴らしくシンプルな PlayFramework ソリューションは、次の ActionBuilder を使用することができます。

import play.api.mvc._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

// An Actionbuilder for CORS - Cross Origin Resource Sharing  
object CorsAction extends ActionBuilder[Request] {

  def invokeBlock[A](request: Request[A], block: (Request[A]) ⇒ Future[SimpleResult]): Future[SimpleResult] = {
    block(request).map { result =>
      request.headers.get("Origin") match {
        case Some(o) => result.withHeaders("Access-Control-Allow-Origin" -> o)
        case None => result
      }
    }
  }
}

ActionBuilder は、アプリケーション コントローラー アクションによって作成された結果 (Play >= 2.1 の Future オブジェクトによってラップされる) を、追加の "Access-Control-Allow-Origin" ヘッダー フィールドを持つ同じ結果にマップする目的で、invokeBlock メソッドをオーバーライドします。リクエストには「Origin」ヘッダー フィールドが含まれていました。

上記のアクション ビルダーは、次のように簡単に使用できます。

object MyController extends Controller {

  def myAction = CorsAction {
     Ok("whatever HTML or JSON you want")
     // it will be certainly processed by your browser
  }
}
于 2014-04-16T22:43:48.460 に答える