Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 玩2.4:如何允许源文件中的CORS://_Javascript_Playframework_Cors - Fatal编程技术网

Javascript 玩2.4:如何允许源文件中的CORS://

Javascript 玩2.4:如何允许源文件中的CORS://,javascript,playframework,cors,Javascript,Playframework,Cors,我正在使用Play2.4制作一个公共RESTAPI。我添加了CORS过滤器,允许所有源代码和标题 请参阅application.conf: play.filters { # CORS filter configuration cors { # The path prefixes to filter. pathPrefixes = ["/"] # The allowed origins. If null, all origins are allowed.

我正在使用Play2.4制作一个公共RESTAPI。我添加了CORS过滤器,允许所有源代码和标题

请参阅application.conf:

play.filters {
  # CORS filter configuration
  cors {

    # The path prefixes to filter.
    pathPrefixes = ["/"]

    # The allowed origins. If null, all origins are allowed.
    allowedOrigins = null

    # The allowed HTTP methods. If null, all methods are allowed
    allowedHttpMethods = null

    # The allowed HTTP headers. If null, all headers are allowed.
    allowedHttpHeaders = null

    # The exposed headers
    exposedHeaders = []

    # Whether to support credentials
    supportsCredentials = true

    # The maximum amount of time the CORS meta data should be cached by the client
    preflightMaxAge = 1 hour
  }
}
当我从经典浏览器(经过chrome/firefox测试)调用API时,无论我允许使用哪种源代码,它都可以正常工作

但是,当我尝试从cordova应用程序调用它时(在cordova应用程序中,ajax请求的来源是
文件://
),我得到一个CORS错误:
请求的资源上不存在“Access Control Allow origin”头。因此,不允许访问源“file://”。响应的HTTP状态代码为403
。好像我不允许origin'file://'

我尝试使用另一个API,该API允许CORS(GET)检查阻止请求的不是cordova,但它工作正常。所以我猜问题来自游戏

我试图设置
allowedOrigins=[“文件:/”]
,但它也不起作用

需要帮忙吗

编辑:这不是的副本:我无法安装Web服务器,因为这是cordova应用程序。这些文件从手机/平板电脑文件系统发送到WebView。 这是一个特定于游戏框架的问题,我以前对旧版本没有任何问题。可能可以修改默认的CorsFilter以允许原始文件://

编辑2:在请求之后,下面是我用于自定义scala过滤器的(非常简单)代码

// CORSFilter.scala
package filters
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.mvc._
import play.mvc.Http

/**
  * Allow CORS from anywhere, any method
  */
class CORSFilter extends EssentialFilter {
  def apply(nextFilter: EssentialAction) = new EssentialAction {
    def apply(requestHeader: RequestHeader) = {
        nextFilter(requestHeader)
          .map { result =>
            if (requestHeader.method.equals("OPTIONS")) {
              Results.Ok.withHeaders(
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN -> "*",
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_HEADERS -> "X-Requested-With, Accept, Content-Type",
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_METHODS -> "HEAD,GET,POST,PUT,PATCH,DELETE")
            } else {
              result.withHeaders(
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN -> "*",
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_HEADERS -> "X-Requested-With, Accept, Content-Type",
                Http.HeaderNames.ACCESS_CONTROL_ALLOW_METHODS -> "HEAD,GET,POST,PUT,PATCH,DELETE",
                Http.HeaderNames.ACCESS_CONTROL_EXPOSE_HEADERS -> "X-Custom-Header-To-Expose")
            }
          }
    }
  }
}

注意,我只在开发模式中使用它,它有一些问题。例如,如果在运行时未捕获异常,则响应将不会具有CORS头,因为未应用筛选器。但是,如果这是针对cordova应用程序的,它应该工作得足够好。

好的,问题来自Play框架中的这行代码:

由于URI为“file://”,因此URI的域/主机为空,因此
newURI
抛出错误,然后Play返回403错误。要解决此问题,我们需要修补框架或尝试将原点更改为“file://”

我为我的用例找到了一个解决方法:在游戏中禁用CORS。然后,当我在cordova应用程序中使用ajax时,不会检查源代码


此解决方案的问题是,如果出于任何原因我想在我的Play项目上启用CORS,则由于Play将检查源代码并拒绝它,因此cordova应用程序将无法工作。

您的cordova实现代码是什么样子的?您好,这是一个重复的:@Saar我为你标记了它:)安装一个本地web服务器…有很多方法可以做到这一点,而且不需要花很长时间。这不是一个重复的Saar,我的问题是播放特定的。我只想授权来自原始文件的请求://,该文件在旧版本中使用。我无法安装本地服务器,因为这是一个cordova应用程序charlitfl,文件从移动文件系统发送到WebView。请解释一下如何禁用CORS?我已经启用了播放过滤器。当我的cordova应用程序不需要它时,我就把它删除了。当时的问题是,如果我在浏览器上测试我的cordova应用程序,如果我没有在chrome中禁用跨域安全性,我就会出现CORS错误。因此,后来我制作了自己的CORSFilter,它为每个请求添加所需的标题,而不进行任何检查。@SebT我面临着同样的情况。你能分享你制作的CORSFilter的代码吗?