我正在开发一个AngularJS应用程序,调用使用Play Framework 2.2.0开发的REST API。
我遇到与跨域ajax调用相关的问题,因为Angular应用程序和Play播放器不会托管在同一个域中。
这是我的Angular服务中的JS调用:
$http
.post("http://localhost:9001/category/list", { langCode: 'fr-FR' })
.success(function(data, status, headers, config) {
callback(data.items);
})
.error(function(data, status, headers, config) {
console.log("Error Data : " + data);
console.log("Error Status : " + status);
});
以下是我的Play应用中的路线:
POST /category/list controllers.catalog.ProductCategoryController.list()
我唯一的解决方法如下:
拦截Global类中的所有请求并添加标题
@Override
public Action onRequest(Request request, Method method) {
return new Action.Simple() {
@Override
public Promise<SimpleResult> call(Context ctx) throws Throwable {
Logger.debug("Intercepting request and applying CORS headers...");
ctx.response().setHeader(Controller.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
ctx.response().setHeader(Controller.ACCESS_CONTROL_ALLOW_HEADERS, "Content-Type");
return delegate.call(ctx);
}
};
}
在路线中添加另一条路线
OPTIONS /category/list controllers.catalog.ProductCategoryController.list()
有没有办法让整合更简单?
答案 0 :(得分:2)
没有开箱即用的CORS支持;这是我希望改变的情况,但是现在你已经确定了一个疣。
好消息是,您可以管理全局解决方法如果您可以为所有资源设置一个CORS设置。它可以通过几种方式完成,其中一种方式是您确定的。我倾向于采用低级OPTIONS路线。
类似的东西:
OPTIONS /*path controllers.Application.options()
从那里,您的处理程序定义可以是:
Ok("").withHeaders(
"ACCESS_CONTROL_ALLOW_METHODS" -> "GET, POST, PUT, PATCH",
"ACCESS_CONTROL_ALLOW_HEADERS"->"Content-Type",
"ACCESS_CONTROL_ALLOW_ORIGIN" -> "*"
)
它不是超级干净,但是直到Play增加了一些可行的东西,我认为这是你制作大量OPTIONS路线的最佳选择(再次假设你对全球CORS设置感到满意)
答案 1 :(得分:-1)
您必须为Play网络服务器启用CORS支持。以下url确实有很多方法可以配置服务器以支持跨源支持: