在 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 过滤器?