在Play Framework 2.4.x中解决CORS问题

niz*_*ize 8 java cors playframework playframework-2.4

我有一个java play框架2.4.x Web应用程序,提供JSON/HTTP API.当我运行我的前端HTML/JS file:///Users/nize/tmp/index.htmlhttp://localhost:9000chrome show上调用API时

XMLHttpRequest cannot load http://localhost:9000. 
No 'Access-Control-Allow-Origin' header is present 
on the requested resource. Origin 'null' is therefore 
not allowed access. The response had HTTP status code 403.
Run Code Online (Sandbox Code Playgroud)

我已根据Play Framework 2.4.x CORS文档中的说明配置了Web应用程序:

  • 更新到 build.sbt
  • 将类添加Filters.java到项目的根目录(也尝试过/app)
  • 添加以下节到 application.conf

    play.filters.cors {allowedOrigins = ["*"," http:// localhost "] #allowedHttpMethods = ["GET","POST"] #allowedHttpHeaders = ["Accept"] #preflightMaxAge = 3 days}

我错过了什么?

编辑: 症状看起来与其他非常相似的stackoverflow帖子相同或类似.通过重新配置计算机上安装的Cisco AnyConnect VPN解决了该问题.但是,我没有安装该软件.

Sup*_*hne 14

首先将这些行(配置)添加/编辑到conf/application.conf中

 play.filters.cors {
  # allow all paths
  pathPrefixes = ["/"]
  # allow all origins (You can specify if you want)
  allowedOrigins = null
  allowedHttpMethods = ["GET", "POST", "PUT", "DELETE"]
  # allow all headers
  allowedHttpHeaders = null
 }   
Run Code Online (Sandbox Code Playgroud)

(请注意,以"#"开头的行是注释行.)

然后转到build.sbt并添加此行.

libraryDependencies += filters
Run Code Online (Sandbox Code Playgroud)

最后创建一个名为"Filters.java"的Java类,并将其包含在根目录(/ app)中.

import play.api.mvc.EssentialFilter;
import play.filters.cors.CORSFilter;
import play.http.HttpFilters;

import javax.inject.Inject;

public class Filters implements HttpFilters {

    @Inject
    CORSFilter corsFilter;

    public EssentialFilter[] filters() {
        return new EssentialFilter[] { corsFilter };
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以参考官方文档以获取更多信息.

  • corsFilter.asJava() 2.5 版没问题,谢谢 (2认同)

小智 7

我在遵循相同的文档时遇到了同样的问题.

问题在于您使用过的CORS过滤器:

allowedOrigins = ["*","http://localhost"]
Run Code Online (Sandbox Code Playgroud)

如果您想允许所有来源使用:

allowedOrigins = null
Run Code Online (Sandbox Code Playgroud)

遵循相同的 allowedHttpMethods

这是根据文档

报价:

允许的起源.如果为null,则允许所有原点.

allowedOrigins = null
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Ric*_*eek 5

我认为Play 中的 CORS 过滤器不起作用!我一步步遵循,但不知何故,我总是在 Ajax 调用的浏览器(Chrome 和 Firefox)中收到 HTTP-403。问题是我什至没有在服务器端获得堆栈跟踪。我认为DefaultHttpErrorHandlerCORS 过滤器会以某种方式吞掉它。在响应中,缺少“Access-Control-Allow-Origin”标头,因此我只是手动添加了该标头。

class Filters @Inject() (corsFilter: CORSFilter, log: LoggingFilter) extends HttpFilters {
  def filters = {
    // CORS filter does not work
    //Seq(corsFilter, log)
    Seq(log)
  }
}
Run Code Online (Sandbox Code Playgroud)

这是日志过滤器(来源:Play!framework)

class LoggingFilter extends Filter {

  def apply(nextFilter: RequestHeader => Future[Result])(requestHeader: RequestHeader): Future[Result] = {

    val startTime = System.currentTimeMillis

    nextFilter(requestHeader).map { result =>

      val endTime = System.currentTimeMillis
      val requestTime = endTime - startTime

      Logger.info(s"${requestHeader.method} ${requestHeader.uri} " +
        s"took ${requestTime}ms and returned ${result.header.status}")

      result.withHeaders(
        "Request-Time" -> requestTime.toString,
        "Access-Control-Allow-Origin" -> "*"   // Added this header
      )
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Cha*_* O. 0

它在火狐浏览器中工作吗?Chrome 对从本地文件运行 Ajax 有一些限制,例如,请参阅此链接。如果是 Chrome 特定的,您可以使用命令行开关启动 Chrome 以消除限制。