播放2.0.1并设置Access-Control-Allow-Origin [英] Play 2.0.1 and setting Access-Control-Allow-Origin

查看:115
本文介绍了播放2.0.1并设置Access-Control-Allow-Origin的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Play 2.0.1应用程序,我想使用托管在其他域上的Javascript调用。我的Javascript调用失败:

I have a Play 2.0.1 application that I want to call using Javascript hosted on other domains. My Javascript call is failing with:

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)后,我尝试了以下方法以使工作正常:

I have found a number of examples of how to set the correct HTTP header in Play 1, but have not found anything for Play 2.0.1. After reading the documentation (http://www.playframework.org/documentation/2.0.2/JavaResponse) I've tried the following just to get things working:

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

但我的JS网络服务电话仍然失败。

but my JS web service call is still failing.

我需要做些什么才能使这个工作?

What do I need to do to get this working?

推荐答案

对于Scala人来说,这是我目前正在使用的实现:

Just for Scala guys, this is the implementation I'm currently using:

import play.api.mvc._
import scala.concurrent._
import play.api.http.HeaderNames._

/**
 * Action decorator that provide CORS support
 *
 * @author Giovanni Costagliola, Nick McCready
 */
case class WithCors(httpVerbs: String*)(action: EssentialAction) extends EssentialAction with Results {
    def apply(request: RequestHeader) = {
        implicit val executionContext: ExecutionContext = play.api.libs.concurrent.Execution.defaultContext
        val origin = request.headers.get(ORIGIN).getOrElse("*")
        if (request.method == "OPTIONS") { // preflight
            val corsAction = Action {
                request =>
                    Ok("").withHeaders(
                        ACCESS_CONTROL_ALLOW_ORIGIN -> origin,
                        ACCESS_CONTROL_ALLOW_METHODS -> (httpVerbs.toSet + "OPTIONS").mkString(", "),
                        ACCESS_CONTROL_MAX_AGE -> "3600",
                        ACCESS_CONTROL_ALLOW_HEADERS ->  s"$ORIGIN, X-Requested-With, $CONTENT_TYPE, $ACCEPT, $AUTHORIZATION, X-Auth-Token",
                        ACCESS_CONTROL_ALLOW_CREDENTIALS -> "true")
            }
            corsAction(request)
        } else { // actual request
            action(request).map(res => res.withHeaders(
                ACCESS_CONTROL_ALLOW_ORIGIN -> origin,
                ACCESS_CONTROL_ALLOW_CREDENTIALS -> "true"
            ))
        }
    }
}

要使用它,只需按以下方式装饰你的行动:

To use it just decorate your action in the following way:

def myAction = WithCors("GET", "POST") {
  Action { request =>
    ???
  }
}

这篇关于播放2.0.1并设置Access-Control-Allow-Origin的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆