CORS Play框架 [英] CORS Play Framework

查看:654
本文介绍了CORS Play框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在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虽然 -

不是Java),并且这个导入对我很好: -

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆