Java Play Framework 2.6 不返回“Access-Control-Allow-Origin”CORS 标头

Posted

技术标签:

【中文标题】Java Play Framework 2.6 不返回“Access-Control-Allow-Origin”CORS 标头【英文标题】:Java Play Framework 2.6 does not return `Access-Control-Allow-Origin` CORS header 【发布时间】:2019-03-31 11:59:14 【问题描述】:

Play 不支持我的 application.conf 配置以返回 Access-Control-Allow-Origin 标头。当我从 Ajax 发送请求时,响应总是:

Failed to load http://localhost:9000/: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

这就是我的application.conf 的样子:

# disable the built in filters
play.http.filters = play.api.http.NoHttpFilters

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

play.filters 
    cors 
    # The allowed origins. If null, all origins are allowed.
    allowedOrigins = null
   

我成功通过 Ajax 请求的唯一方法是在控制器中添加行 response().setHeader("Access-Control-Allow-Origin", "*");。但我想通过application.conf 来完成,所以我不必在所有控制器中添加这个setHeader() 代码。

public class HomeController extends Controller 

    public Result index() 
        // this is the only hack that works
        //response().setHeader("Access-Control-Allow-Origin", "*");

        return ok(
            Json.toJson("A long time ago in a galaxy far, far away....")
        );
    

我的 Ajax 请求如下所示:

$.ajax(
    url: "http://localhost:9000",
    type: "GET",
    dataType: 'json',
    success: function(_out) 
        alert(_out);
    ,
    fail: function() 
        alert("error");
    
);

为什么 Play 不支持我的 CORS application.conf 配置?

【问题讨论】:

【参考方案1】:

我已经确定了问题。在我的application.conf:

play.http.filters = play.api.http.NoHttpFilters

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

这两行不是相加的。换句话说,第一行禁用所有过滤器,第二行启用一个过滤器,但最终结果仍然是所有过滤器都被禁用(即使启用是在禁用之后)。

【讨论】:

以上是关于Java Play Framework 2.6 不返回“Access-Control-Allow-Origin”CORS 标头的主要内容,如果未能解决你的问题,请参考以下文章

Scala Play Framework 2.6密封特征格式给Json

Play Framework 2.6 中未触发 Slick (postgresql) 演变

Play Framework Java - 包 play.db 不存在

Play Framework:“连接太多”数据库错误

在 Play 框架 Java 2.6 中添加 Paypal 按钮

Play Framework 1.2.5.1 和 1.2.6 版本之间的区别?