通过以下方法解决了这个问题:
来自服务器的所有 API 响应都应包含标头:“Access-Control-Allow-Origin”、“*”。我们需要为所有操作响应编写一个包装器。
在 Global.java 中
import java.net.URL;
import play.*;
import play.libs.F.Promise;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.Result;
public class Global extends GlobalSettings {
// For CORS
private class ActionWrapper extends Action.Simple {
public ActionWrapper(Action<?> action) {
this.delegate = action;
}
@Override
public Promise<Result> call(Http.Context ctx) throws java.lang.Throwable {
Promise<Result> result = this.delegate.call(ctx);
Http.Response response = ctx.response();
response.setHeader("Access-Control-Allow-Origin", "*");
return result;
}
}
@Override
public Action<?> onRequest(Http.Request request,
java.lang.reflect.Method actionMethod) {
return new ActionWrapper(super.onRequest(request, actionMethod));
}
}
服务器请求(例如 POST、PUT)在主请求之前向服务器发出预检请求。这些预检请求的响应应包含以下标头:
“访问控制允许来源”,“”
“允许”, ””
“访问控制允许方法”、“POST、GET、PUT、DELETE、选项”
“访问控制允许标头”、“来源、X-Requested-With、内容类型、接受、引用者、用户代理”
在路线中添加:
OPTIONS /*all controllers.Application.preflight(all)
在应用程序控制器中:
package controllers;
import play.mvc.*;
public class Application extends Controller {
public static Result preflight(String all) {
response().setHeader("Access-Control-Allow-Origin", "*");
response().setHeader("Allow", "*");
response().setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
response().setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Referer, User-Agent");
return ok();
}
}
PS:通过这种方法,我不必为此创建 scala 过滤器。