Javascript 玩2.4:如何允许源文件中的CORS://
我正在使用Play2.4制作一个公共RESTAPI。我添加了CORS过滤器,允许所有源代码和标题 请参阅application.conf: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.
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的代码吗?