我想检查如何在 Playframework 2.1 (Java) 中启用跨域域共享。我没有看到任何有关如何执行此操作的文档。
问问题
1832 次
2 回答
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 覆盖 invokeBlock 方法,目的是将应用程序控制器操作(由 Play >= 2.1 中的 Future 对象包装)创建的结果映射到具有附加“Access-Control-Allow-Origin”标头字段的相同结果,如果该请求带有“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 回答
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 回答