Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Playframework 玩CORS不起作用_Playframework_Playframework 2.6 - Fatal编程技术网

Playframework 玩CORS不起作用

Playframework 玩CORS不起作用,playframework,playframework-2.6,Playframework,Playframework 2.6,我已经在本地部署了我的Play应用程序,并在浏览器中通过localhost:9000访问了我的REST API 但是,当从file:///C:/Users/XXX/XXX//index.html: Failed to load resource: the server responded with a status of 403 (Forbidden) No 'Access-Control-Allow-Origin' header is present on the requested res

我已经在本地部署了我的Play应用程序,并在浏览器中通过
localhost:9000
访问了我的REST API

但是,当从
file:///C:/Users/XXX/XXX//index.html

Failed to load resource: the server responded with a status of 403 (Forbidden)

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 403.
我遵照下面的指示

我的
build.sbt

libraryDependencies ++= Seq(
  jdbc,
  evolutions,
  guice,
  "com.h2database" % "h2" % "1.4.194",
  javaJpa,
  "org.hibernate" % "hibernate-core" % "5.2.5.Final",
  filters
)
我的
application.conf

play.filters.enabled += "play.filters.cors.CORSFilter"   

play.filters.cors {
  # allow all paths
  pathPrefixes = ["/"]
  # allow all origins (You can specify if you want)
  allowedOrigins = null
  allowedHttpMethods = ["GET", "POST", "PUT", "DELETE"]
  # allow all headers
  allowedHttpHeaders = null
 }   
注意:我尝试了
allowedOrigins=null
allowedOrigins=[“*”]

jQuery脚本:

$.ajax({

    'url' : 'http://localhost:9000/employee/' + user_id + '/weeklyWorkingHours',
    'type' : 'GET',
    'success' : function(data) {
        console.log('Data: '+ JSON.stringify(data));

    },
    'error' : function(request,error)
    {
        console.log("Error: "+JSON.stringify(request));
    }
});
下面是剧本的内容:

[warn] p.f.c.CORSFilter - Invalid CORS request;Origin=Some(null);Method=GET;Access-Control-Request-Headers=None

尝试将其放入application.conf(它将允许所有来源)

不要禁用cors过滤器

play.filters.enabled += "play.filters.cors.CORSFilter"

尝试将其放入application.conf(它将允许所有来源)

不要禁用cors过滤器

play.filters.enabled += "play.filters.cors.CORSFilter"

您将无法从本地文件使CORS正常工作。浏览器向服务器发送一个
origin
标题值null,Play不会以
access control allow origin
标题响应。对于测试,您可以设置本地web服务器,例如

cd c:\Users\XXX\XXX
python -m SimpleHTTPServer
然后,您可以按以下方式加载文件:


您将无法从本地文件使CORS正常工作。浏览器向服务器发送一个
origin
标题值null,Play不会以
access control allow origin
标题响应。对于测试,您可以设置本地web服务器,例如

cd c:\Users\XXX\XXX
python -m SimpleHTTPServer
然后,您可以按以下方式加载文件:


因为我花了太多时间在这上面,下面是播放2.12的Java答案:

  • 在app\filters\CorsFilter.java中:

    package filters;
    
    import java.util.concurrent.CompletionStage;
    import java.util.function.Function;
    
    import com.google.inject.Inject;
    import com.google.inject.Singleton;
    
    import akka.stream.Materializer;
    import play.mvc.Filter;
    import play.mvc.Http.RequestHeader;
    import play.mvc.Result;
    
    
    
    @Singleton
    public class CorsFilter extends Filter {
    
        @Inject
        public CorsFilter(Materializer mat) {
         super(mat);
        }
    
        @Override
        public CompletionStage<Result> apply(Function<RequestHeader, CompletionStage<Result>> next, RequestHeader rh) {
    
         return next.apply(rh).thenApply(result ->
             {
                 return result.withHeaders(
                         "Access-Control-Allow-Origin" , "*",
                         "Access-Control-Allow-Methods" , "OPTIONS, GET, POST, PUT, DELETE, HEAD",
                         "Access-Control-Allow-Headers" , "Accept, Content-Type, Origin, X-Json, X-Prototype-Version, X-Requested-With",
                         "Access-Control-Allow-Credentials" , "true"
                     );
             });
        }
    
  • 在conf\routes中,添加以下内容:

    OPTIONS    /          controllers.OptionsController.options(path: String ?= "")
    OPTIONS    /*path     controllers.OptionsController.options(path)
    
  • 添加类controllers.OptionsController(在app\controllers\OptionsController.java中):


  • 因为我花了太多的时间在这上面,下面是Java for Play 2.12的答案:

  • 在app\filters\CorsFilter.java中:

    package filters;
    
    import java.util.concurrent.CompletionStage;
    import java.util.function.Function;
    
    import com.google.inject.Inject;
    import com.google.inject.Singleton;
    
    import akka.stream.Materializer;
    import play.mvc.Filter;
    import play.mvc.Http.RequestHeader;
    import play.mvc.Result;
    
    
    
    @Singleton
    public class CorsFilter extends Filter {
    
        @Inject
        public CorsFilter(Materializer mat) {
         super(mat);
        }
    
        @Override
        public CompletionStage<Result> apply(Function<RequestHeader, CompletionStage<Result>> next, RequestHeader rh) {
    
         return next.apply(rh).thenApply(result ->
             {
                 return result.withHeaders(
                         "Access-Control-Allow-Origin" , "*",
                         "Access-Control-Allow-Methods" , "OPTIONS, GET, POST, PUT, DELETE, HEAD",
                         "Access-Control-Allow-Headers" , "Accept, Content-Type, Origin, X-Json, X-Prototype-Version, X-Requested-With",
                         "Access-Control-Allow-Credentials" , "true"
                     );
             });
        }
    
  • 在conf\routes中,添加以下内容:

    OPTIONS    /          controllers.OptionsController.options(path: String ?= "")
    OPTIONS    /*path     controllers.OptionsController.options(path)
    
  • 添加类controllers.OptionsController(在app\controllers\OptionsController.java中):



  • 不幸的是,这并不能解决这个问题。无论如何,谢谢!好的,那么play.filters.cors.allowedOrigins=[“也不起作用,因为我正在从不同的域访问我的REST服务,只需使用不同的域play.filters.cors.allowedOrigins=[“localhost:9000”,“domain2.com”,“domain3.com”]难道没有办法接受所有域吗?在我的项目设置中,我将无法这样做。不幸的是,它无法解决问题。无论如何,谢谢!好的,那么play.filters.cors.allowedOrigins=[”也不起作用,因为我正在从不同的域访问我的REST服务。只需使用不同的域填充它play.filters.cors.allowedOrigins=[“localhost:9000”、“domain2.com”、“domain3.com”]没有办法接受所有域吗?在我的项目设置中,我将无法这样做。播放规范说默认情况下允许所有源代码。您提到您尝试了
    AllowedOriginates=null
    AllowedOriginates=[“*”]
    。您尝试删除它了吗?谢谢您的提示。不幸的是,它没有起作用。我认为问题出在这里
    Origin=Some(null)
    。Play将验证这一点,因为
    isValidOrigin=new URI(“null”).getScheme ne null
    。返回false。是否可以尝试使用有效的
    源代码执行请求?这是
    源代码=
    ?播放规范说明默认情况下允许所有源代码
    。您提到您尝试了
    AllowedOriginates=null
    AllowedOriginates=[“*”]
    。您尝试删除它了吗?谢谢您的提示。不幸的是,它没有起作用。我认为问题出在这里
    Origin=Some(null)
    。Play将验证这一点,因为
    isValidOrigin=new URI(“null”).getScheme ne null
    。返回false。您可以尝试使用有效的
    源代码来执行请求吗?这是
    源代码=
    ?感谢您的回答。是否可以将播放配置为也接受空值?我认为CORS仍然无法正常工作,因为使用用于CORS的chrome插件(),我可以从本地文件调用localhost。我还没有找到这样配置Play的方法,我已经阅读了足够多的源代码,我认为没有对其进行规定。该扩展不会修改
    origin
    标头,因此您不会喜欢Play。请确保使用开发工具监视该标头。尝试本地web服务器。谢谢你的回答。难道不可能将播放配置为也接受空值吗?我认为CORS仍然不能像预期的那样工作,因为有了CORS的chrome插件(),我可以从本地文件调用localhost。我还没有找到这样配置Play的方法,我已经阅读了足够多的源代码,我认为没有对其进行规定。该扩展不会修改
    origin
    标头,因此您不会喜欢Play。请确保使用开发工具监视该标头。尝试本地web服务器。