在 Java Play 应用中启用 CORS 过滤器

Posted

技术标签:

【中文标题】在 Java Play 应用中启用 CORS 过滤器【英文标题】:Enabling CORS filter in Java play app 【发布时间】:2016-08-19 11:10:33 【问题描述】:

我尝试在我的 java play 应用上启用 CORS 过滤器。我正在使用 angularjs 访问 localhost 来获取一些数据。这是我在 Play 应用程序方面所做的,

application.conf

play.http.filters = "com.de.filters.Filters"
play.filters.cors 
    allowedOrigins = null
    allowedHttpMethods = ["GET", "POST"]
    allowedHttpHeaders = ["Accept"]
    preflightMaxAge = 3 days

Filters.java

public class Filters implements HttpFilters 
    @Inject
    CORSFilter corsFilter;

    public EssentialFilter[] filters() 
        return new EssentialFilter[]corsFilter;
    

当我尝试调用我的服务时,它给了我一个错误,

XMLHttpRequest 无法加载 http://localhost:9000/app/search/0/10。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost' 不允许访问。响应的 HTTP 状态代码为 403。

我该如何解决这个问题?

【问题讨论】:

也许尝试将 allowedOrigins 设为空字符串而不是 null ? allowedOrigins = 。或者甚至只是省略该参数。看看它是否允许。或者添加 localhost 或 127.0.0.1 到它。 我做了allowedOrigins = ["127.0.0.1"]。但我仍然无法访问。 【参考方案1】:

来自Play 2.3 Documentation, 首先将您的过滤器添加到build.sbt 中的libraryDependencies 列表中,如下所述。

libraryDependencies += filters

然后,在application.conf 中,不要将play.filters.cors.allowedOrigins 设置为[null],它默认为“允许所有来源”。设置一个有效的域列表或忽略它。不要忘记引用您的过滤器:

play.http.filters = "filters.Filters"

最后,在你的Filters.filter() 方法中,写如下,指定asJava() 方法,如文档中所述。

public EssentialFilter[] filters() 
    return new EssentialFilter[]  
        corsFilter.asJava()
    ;

【讨论】:

【参考方案2】:

将这些行添加到 application.conf 中。

play.filters.cors 
  # allow all paths
  pathPrefixes = ["/"]
  # allow all origins
  allowedOrigins = null
  allowedHttpMethods = ["GET", "POST", "PUT", "DELETE"]
  # allow all headers
  allowedHttpHeaders = null

您可以参考我的this回答以获取更多信息。

【讨论】:

【参考方案3】:

我终于让我的 CORSFilter 工作了。关于这方面的文档很少,而且那里的文档不起作用。希望这可以帮助某人。 (播放 2.5.4)

import com.google.inject.Inject;
import play.http.HttpFilters;
import play.mvc.EssentialAction;
import play.mvc.EssentialFilter;
import play.filters.cors.CORSFilter;

public class MyFilters extends EssentialFilter implements HttpFilters 

    @Inject
    private CORSFilter corsFilter;


    @Override
    public EssentialAction apply(EssentialAction next) 
        return corsFilter.asJava().apply(next);
    

    @Override
    public EssentialFilter[] filters() 
        EssentialFilter[] result = new EssentialFilter[1];
        result[0] = this;

        return result;
    

也将此添加到 application.conf 中

play.filters.cors
# allow all paths
  pathPrefixes = ["/"]
  # allow all origins
  allowedOrigins = null
  allowedHttpMethods = ["GET", "POST", "PUT", "DELETE"]
  # allow all headers
  allowedHttpHeaders = null

【讨论】:

Java 的 2.5 过滤器显然已损坏,但已修复:github.com/playframework/playframework/pull/6238/files

以上是关于在 Java Play 应用中启用 CORS 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 play 2.2.0 Java 中实现 CORS 过滤器?

Angular 4 App调用Play Framework Web App的CORS问题

如何在 Spring 4.2 中启用 CORS 过滤器

为啥我需要在 tomcat 应用程序上启用 CORS

Scala Play 框架仅启用某些过滤器

我应该在哪里编写 angularjs 中的 cors 过滤器启用代码