同源策略
一、跨域的集中方法:
- 服務器端發送請求,服務器作為中繼代理(此方法不理解)
- iframe
- script標簽
通過動過動態生成script標簽,並將src指向目標源的方式
原生實現方式示例:
var url="www.xxx.baidu.com/aa.js", scriptTag=document.createElement("script"); scriptTag.src=url; document.getElementByTagName("head")[0].appendChild(scriptTag); function showSth(data){ alert(data.a); } ////////////aa.js var aa={"a":"A"}; showSth(aa);
二、jsonp:
1、客戶端
使用script標簽實現跨域訪問、可在url中指定回調函數、獲取json數據並在指定的回調函數中執行
jQuery實現jsonp
//$.getJSON var url="wwwa.xxx.baidu.com/aa.js?callback=?"//使用?作為回調函數名,jquey會自動生成隨機名替換?號。 $.getJSON(url,function(jsoon){ alert(json.name+json.Email); }); //$.ajax; var url=www.xxx.baidu.com/aa.asmx?code=xx $.ajax({ url: url, dataType: jsonp, jsonp:”callback”,//傳遞給請求處理程序的參數名,用來獲取jsonp回調函數名(默認為“callback”,自動在URL中加上callback=?參數) jsonpCallback:”GetUser”,//自定義的jsonp回調函數名(默認為jquery自動生成的隨機函數名),此參數通常不用設置 success:function(json){ alert(json.name+json.Email); } });
jQuery 只支持get方式的jsonp實現。
jsonp的缺點:如果返回的數據格式有問題或返回失敗了,並不會報錯。
2、服務端
string jsoncallback = context.Request["callback"]; //如果不指定jsoncallback參數名,則返回隨機函數名。 string jsonp=jsoncallback+"("+ new JavaScriptSerializer(new {Name="a",Email="B"})+")" context.Response.ContentType = "text/plain"; context.Response.Write(jsonp);