这里有一些背景信息...
- 1) http://www.html5rocks.com/en/tutorials/cors/ - 请注意,您需要阅读有关“不那么简单的请求”的部分,因为 JSON 属于此类。
- 2) http://stackoverflow.com/questions/9613210/cors-access-control-allow-origin-despite-correct-headers?rq=1
- 3) http://caniuse.com/#search=cors - 详细了解支持 CORS 的浏览器
- 4) http://stackoverflow.com/questions/10748537/access-control-allow-origin-on-playframework(适用于 Play 1 NOT Play 2)
所以这是我实现的:
由于不是那么简单的请求(参见上面的 1)进行飞行前调用,您需要将以下内容添加到路由文件中:
POST /url_to_json_webservice controllers.myJsonWebServices.myJsonWebService
OPTIONS /url_to_json_webservice controllers.myJsonWebServices.checkPreFlight
然后在你的控制器中设置如下方法:
public static Result checkPreFlight() {
response().setHeader("Access-Control-Allow-Origin", "*"); // Need to add the correct domain in here!!
response().setHeader("Access-Control-Allow-Methods", "POST"); // Only allow POST
response().setHeader("Access-Control-Max-Age", "300"); // Cache response for 5 minutes
response().setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); // Ensure this header is also allowed!
return ok();
}
注意我可能在这里设置了比需要更多的标题,所以请检查你需要哪些!
还记得将以下内容添加到返回实际 JSon 结果的控制器方法的末尾(如我上面的问题):
public static Result myJsonWebService() {
...
response().setHeader("Access-Control-Allow-Origin", "*");
return ok(toJson(jsonObject));
}