Playframework 允许跨源域共享

Playframework 允许跨源域共享,playframework,playframework-2.1,Playframework,Playframework 2.1,我想检查如何在PlayFramework2.1(Java)中启用跨源域共享。我没有看到任何关于如何做到这一点的文档 不确定这是如何转化为2.x的,但在1.2.5中,我所做的就是这样。如果您有非标准标头,则访问控制允许标头是可选的。您可以将“允许来源”的*更改为仅匹配您要允许的域 @Before static void CORS() { if(request.headers.containsKey("origin")){ response.headers.put("Acce

我想检查如何在PlayFramework2.1(Java)中启用跨源域共享。我没有看到任何关于如何做到这一点的文档

不确定这是如何转化为2.x的,但在1.2.5中,我所做的就是这样。如果您有非标准标头,则访问控制允许标头是可选的。您可以将“允许来源”的*更改为仅匹配您要允许的域

@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)或使用自定义标头,大多数用户代理都将有一个飞行前选项调用,因此您需要做的是将其添加到我的routes文件中:

#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() {}

使用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重写invokeBlock方法,目的是将由应用程序控制器操作(由播放中的未来对象包装>=2.1)创建的结果映射到具有附加“访问控制允许原点”标题字段的相同结果(如果请求带有“原点”标题字段)

上述action builder的使用方法如下:

object MyController extends Controller {

  def myAction = CorsAction {
     Ok("whatever HTML or JSON you want")
     // it will be certainly processed by your browser
  }
}