CORS Play框架 [英] CORS Play Framework
问题描述
我正在Play Framework 2.5(Java)后端开发一个Angular 2应用程序。如果我通过浏览器URL访问我的端点,他们工作正常。但是,从Angular 2应用程序调用它显示错误:
XMLHttpRequest无法加载localhost:9000 / app / myendpoint。在所请求的
资源上没有
'Access-Control-Allow-Origin'头。因此,'localhost:3000'是不允许
访问的。响应的HTTP状态代码为500.
我尝试按照文档并创建过滤器:
在application.conf中:
play.filters {
cors {
pathPrefixes = [/ app]
allowedOrigins = null
allowedHttpMethods = null
}
过滤器:
import play.mvc。*;
import play.api.http.DefaultHttpFilters; < - 此导入错误
import play.filters.cors.CORSFilter;
public class Filter extends DefaultHttpFilters {
@Inject public Filter(CORSFilter corsFilter){
super(corsFilter);
}
}
在build.sbt:
libraryDependencies ++ = Seq(
...,
filters
)
有没有人知道真正的解决方案?谢谢:)
工作代码:
Filters.java root)
import com.google.inject.Inject;
import com.google.inject.Singleton;
import play.http.HttpFilters;
import play.mvc.EssentialAction;
import play.mvc.EssentialFilter;
import play.filters.cors.CORSFilter;
@Singleton
public class Filters 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中:
#filters + = Filters< - 是的,它是评论,因为我的过滤器是在项目的根
libraryDependencies + = filters
play.filters {
cors {
#允许所有路径
pathPrefixes = [/]
#allow all origins
allowedOrigins = null
allowedHttpMethods = [GET,POST,PUT,DELETE]
#允许所有标题
allowedHttpHeaders = null
} ...
在build.sbt中:
libraryDependencies ++ = Seq(
...,
filters
)
谢谢大家! :)
我记得有同样的导入问题,因为我认为有一些重新包装的变化, c $ c> 2.5.0 。在重构过程中, DefaultHttpFilters
被 HttpFilters
替代。
检查源代码中 HttpFilters
的正确路径。为您正在使用的播放版本选择正确的标记,然后向下搜索源代码树,直到找到 HttpFilters
并检查包。 这是路径Java API for v 2.5.0 。
从您的帖子看,您使用的是Java API,但使用了导入Scala
Play 2.5.0
的导入为: -
Scala - import play.api.http.HttpFilters
Java - 导入播放。我正在使用Play
2.5.0
(Scala虽然 -
import play.api.http.HttpFilters
根据您发布的内容,我认为您应该尝试将有问题的导入更改为: -
import play.http.HttpFilters
另外,(如其他人所说)我假设你已经为你的 Filters.java
文件配置了包,如果你没有放置
这是我的 application.conf
中的条目,因为我使用 package filters
而不是默认包。: -
play.http.filters = filters.Filters
I'm developing an Angular 2 application on top of a Play Framework 2.5 (Java) back-end. If I access my endpoints through browser URL, they work fine. However, calling it from the Angular 2 application shows the error:
XMLHttpRequest cannot load localhost:9000/app/myendpoint. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'localhost:3000' is therefore not allowed access. The response had HTTP status code 500.
I have tryed to follow the documentation and create the filter:
In application.conf:
play.filters {
cors {
pathPrefixes = ["/app"]
allowedOrigins = null
allowedHttpMethods = null
}
Filter:
import play.mvc.*;
import play.api.http.DefaultHttpFilters; <- error with this import
import play.filters.cors.CORSFilter;
public class Filters extends DefaultHttpFilters {
@Inject public Filters(CORSFilter corsFilter) {
super(corsFilter);
}
}
In build.sbt:
libraryDependencies ++= Seq(
...,
filters
)
Does anyone knows the true solution? Thank you :)
Working code:
Filters.java (on project's root)
import com.google.inject.Inject;
import com.google.inject.Singleton;
import play.http.HttpFilters;
import play.mvc.EssentialAction;
import play.mvc.EssentialFilter;
import play.filters.cors.CORSFilter;
@Singleton
public class Filters 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;
}
}
In application.conf:
#filters += Filters <- yes, it is commented since my Filters is in project's root
libraryDependencies += filters
play.filters {
cors{
# allow all paths
pathPrefixes = ["/"]
# allow all origins
allowedOrigins = null
allowedHttpMethods = ["GET", "POST", "PUT", "DELETE"]
# allow all headers
allowedHttpHeaders = null
} ...
In build.sbt:
libraryDependencies ++= Seq(
...,
filters
)
Thank you all! :)
I remember having the same import issue since I think there were some repackaging changes for Filters in Play somewhere around 2.5.0
. And DefaultHttpFilters
was replaced by HttpFilters
during that refactoring.
Check the source code for the correct path to HttpFilters
. Choose the correct tag for the version of Play you are using and then search down the source tree until you find HttpFilters
and check the package. This is the path for the Java API for v 2.5.0.
From your post it seems you are using the Java API but are using the import for the Scala version.
The imports for Play 2.5.0
are:-
Scala - import play.api.http.HttpFilters
Java - import play.http.HttpFilters
I'm using Play 2.5.0
(Scala though - not Java) and this import is working fine for me:-
import play.api.http.HttpFilters
From what you have posted I think you should try changing your problematic import to:-
import play.http.HttpFilters
Also, (as others have stated) I assume you have configured the package for your Filters.java
file if you have not placed it in the root package.
This is the entry in my application.conf
since I am using package filters
rather than the default package.:-
play.http.filters = "filters.Filters"
这篇关于CORS Play框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!