CORS Play Framework

Pat*_*cya 9 java cors playframework angular

我正在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
  }
Run Code Online (Sandbox Code Playgroud)

过滤:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在build.sbt中:

libraryDependencies ++= Seq(
  ...,
  filters
)
Run Code Online (Sandbox Code Playgroud)

有谁知道真正的解决方案?谢谢 :)

工作代码:

Filters.java(在项目的根目录下)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在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
} ...
Run Code Online (Sandbox Code Playgroud)

在build.sbt中:

libraryDependencies ++= Seq(
  ...,
  filters
)
Run Code Online (Sandbox Code Playgroud)

谢谢你们!:)

Jac*_*cko 1

我记得有同样的导入问题,因为我认为 Play 中的过滤器有一些重新打包更改2.5.0。并在重构期间DefaultHttpFilters被替换。HttpFilters

检查源代码以获得正确的路径HttpFilters。为您正在使用的 Play 版本选择正确的标签,然后向下搜索源代码树,直到找到HttpFilters并检查该包。这是 v 2.5.0 的 Java API 的路径

从您的帖子来看,您似乎正在使用 Java API,但正在使用 Scala 版本的导入。

Play 的导入2.5.0是:-

斯卡拉import play.api.http.HttpFilters
-Java-import play.http.HttpFilters

我正在使用 Play 2.5.0(虽然是 Scala - 不是 Java),这个导入对我来说工作得很好:-

import play.api.http.HttpFilters
Run Code Online (Sandbox Code Playgroud)

根据您发布的内容,我认为您应该尝试将有问题的导入更改为:-

import play.http.HttpFilters
Run Code Online (Sandbox Code Playgroud)

另外,(正如其他人所说)Filters.java如果您尚未将文件放入根包中,我假设您已为文件配置了包。

这是我的条目application.conf,因为我正在使用package filters而不是默认包。:-

play.http.filters = "filters.Filters"
Run Code Online (Sandbox Code Playgroud)