(一)場景
在拉京東城市選擇的基礎數據時候,遇到被服務器拒絕的狀況,也就是ajax跨域問題javascript
(二)json和jsonp
說的直白一點,在咱們作ajax異步的一些功能的時候,必定會或多或少的遇到兩個問題,(一、數據的交換。二、跨域問題)java
JSONP的最基本的原理是:動態添加一個<script>標籤,而script標籤的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax XmlHttpRequest協議無關了。咱們在用其餘關於src的標籤的時候,均可以跨域。因此咱們只要動態構造的src標籤一樣能夠作到跨域。jquery
<script type="text/javascript">
function <span style="color: #ff0000;">jsonpCallback</span>(result)
{
alert(result.msg);
}
</script>
<script type="text/javascript" src="http://crossdomain.com/jsonServerResponse?jsonp=<span style="color: #ff0000;">jsonpCallback</span>"></script>
從紅色的地方能夠看出,兩個名字要一直,不過通常採用callback而後後面加一個「?」此時jquery會自動生成一個函數名,這樣能夠作到發送不少請求的時候,並不會互相影響。ajax
同源策略 :即JavaScript只能訪問與包含它的文檔在同一域下的內容。json
jsonp能夠跨越同源策略,當咱們使用了jsonp,將會是另一種協議通訊了。跨域
JSONP的優勢是:它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中均可以運行,不須要XMLHttpRequest或ActiveX的支持;而且在請求完畢後能夠經過調用callback的方式回傳結果。瀏覽器
JSONP的缺點則是:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種狀況,不能解決不一樣域的兩個頁面之間如何進行JavaScript調用的問題。服務器
(三)使用方法
$.getJSON("http://跨域的dns/document!searchJSONResult.action?name1="+value1+"&jsoncallback=?",
function(json){
if(json.屬性名==值){
// 執行代碼
}
});
$.ajax({
async:false,
url: http://跨域的dns/document!searchJSONResult.action,
type: "GET",
dataType: 'jsonp',
一般狀況通常是這兩種使用方法,在跨域問題上,很是簡單。dom
在這裏附一個json的處理方法異步
public static Object[] getDTOArray(String jsonString, Class<?> clazz){
net.sf.json.JSONArray array = net.sf.json.JSONArray.fromObject(jsonString);
Object[] obj = new Object[array.size()];
for(int i = 0; i < array.size(); i++){
net.sf.json.JSONObject jsonObject = array.getJSONObject(i);
obj[i] = net.sf.json.JSONObject.toBean(jsonObject, clazz);
}
return obj;
}