在項目中須要經過ajax方法遠程調用其它JFinal服務器的服務,會報出No 'Access-Control-Allow-Origin' header is present on the requested resource錯誤。瀏覽器默認不容許跨域 。這裏提供兩種方法。java
正常調用以下:ajax
客戶端json
$.ajax({ type : "post", url : "http://192.168.0.5/order", data : data, dataType : "json", contentType: "application/x-www-form-urlencoded; charset=UTF-8", async: false, cache: false, success:function(response){ //擴展回調函數 if( callback != null ){ callback(response); } }, error : function() { alert("服務器發生錯誤"); } });
服務端
跨域
public class OrderController extends Controller { private static Logger log = Logger.getLogger(OrderController.class); public void index() { Map<String, Object> json = new HashMap<String, Object>(); json.put("info", "下單成功! "); json.put("status", "1"); renderJson(json); } }
此時發現跨域請求沒法實現,有以下兩種方法。瀏覽器
1、在服務端進行設置跨域許可設定。在controller方法中加入getResponse().addHeader("Access-Control-Allow-Origin", "*");便可。安全
public class OrderController extends Controller { private static Logger log = Logger.getLogger(OrderController.class); public void index() { getResponse().addHeader("Access-Control-Allow-Origin", "*"); Map<String, Object> json = new HashMap<String, Object>(); json.put("info", "下單成功! "); json.put("status", "1"); renderJson(json); } }
2、經過jsonp進行。避免方法一的安全隱患。服務器
客戶端代碼格式由json改成jsonpapp
$.ajax({ type : "post", url : "http://192.168.0.5/order", data : data, dataType : "jsonp", contentType: "application/x-www-form-urlencoded; charset=UTF-8", async: false, cache: false, success:function(response){ //擴展回調函數 if( callback != null ){ callback(response); } }, error : function() { alert("服務器發生錯誤"); } });
要理解json和jsonp的不一樣之處,對服務端返回格式進行調整async
public class OrderController extends Controller { private static Logger log = Logger.getLogger(OrderController.class); public void index() { Map<String, Object> json = new HashMap<String, Object>(); json.put("info", "下單成功! "); json.put("status", "1"); String callback=getRequest().getParameter("callback"); json.put("res", true); String jsonp=callback+"("+JsonKit.toJson(json)+")"; renderJson(jsonp); } }