1. 程式人生 > >[jQuery]Ajax實現跨域訪問JSON

[jQuery]Ajax實現跨域訪問JSON

Ajax跨域訪問JSON

環境:.net4.0+jQuery+JSON.net

因為在跨域實現,所以這裡新建網站,這個網站只需要Ashx檔案

public void ProcessRequest(HttpContext context)

{

stringstrJson="[{"id":"100009","name":"mayixue","link":"www.mayixue.com"},{"id":"100009","name":"mogujie","link":"www.mogujie.com"},{"id":"100009","name":"dazayuan","link":"www.dazayuan.com"}]"
;

context.Response.Write(strJson);

}

然後在IIS中建立網站Web_DataSource,就是上邊這個網站。

vs中再建網站專案Web_Client,用於跨域訪問Web_DataSource

(一)正常的JqueryAajx跨域請求

functionjsonajax() {

$.ajax({

url:"http://www.mayixue.com/json/Handler.ashx",

type:"get",

dataType:"json",

success:function(json) {

        if (json != null) {
            var rowcount = json.length;
            if (rowcount > 0) {
                var html = '';
                for (var i = 0; i < rowcount; i++) {
                    html += '<li><div class="dd">·</div><div class="dt"><a href="' + json[i].link + '" target="_blank">' + json[i].name + '</a></div></li>';
                }
                $('.list').html('<ul>' + html + '</ul>');
            }
        }

}

});

}

結果:會彈出提示視窗。

(二)Jquery Jsonp請求

functionjsonpajax() {

$.ajax({

url:"http://www.mayixue.com/json/Handler.ashx?callback=?",

type:"get",

dataType:"jsonp",

jsonp:"callback",

success:function(json) {

        if (json != null) {
            var rowcount = json.length;
            if (rowcount > 0) {
                var html = '';
                for (var i = 0; i < rowcount; i++) {
                    html += '<li><div class="dd">·</div><div class="dt"><a href="' + json[i].link + '" target="_blank">' + json[i].name + '</a></div></li>';
                }
                $('.list').html('<ul>' + html + '</ul>');
            }
        }

}

});

}

此時,跨域的Web_DataSource中的ashx檔案資料提供要改一下:

public void ProcessRequest(HttpContext context)

{

stringstrJson ="[{"id":"100009","name":"mayixue","link":"www.mayixue.com"},{"id":"100009","name":"mogujie","link":"www.mogujie.com"},{"id":"100009","name":"dazayuan","link":"www.dazayuan.com"}]";

stringcallback = context.Request.Params["callback"];

context.Response.Write(callback+"("+strJson+")");

}

返回的資料的格式為:

?([{"id":"100009","name":"mayixue","link":"www.mayixue.com"},{"id":"100009","name":"mogujie","link":"www.mogujie.com"},{"id":"100009","name":"dazayuan","link":"www.dazayuan.com"}])

  =================================知識分享=====================================

JSONP的最基本的原理是:動態新增一個標籤,而script標籤的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax XmlHttpRequest協議無關了.

這樣其實"jQuery AJAX跨域問題"就成了個偽命題了,jquery $.ajax方法名有誤導人之嫌.

如果設為dataType: 'jsonp',這個$.ajax方法就和ajax XmlHttpRequest沒什麼關係了,取而代之的則是JSONP協議.

JSONP是一個非官方的協議,它允許在伺服器端整合Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問JSONPJSON with Padding。由於同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、埠)的資源。如果要進行跨域請求,我們可以通過使用htmlscript標記來進行跨域請求,並在響應中返回要執行的script程式碼,其中可以直接使用JSON傳遞javascript物件。這種跨域的通訊方式稱為JSONP

jsonCallback函式jsonp1236827957501(....):是瀏覽器客戶端註冊的,獲取跨域伺服器上的json資料後,回撥的函式

Jsonp原理:

首先在客戶端註冊一個callback (:'jsoncallback'),然後把callback的名字(:jsonp1236827957501)傳給伺服器。

此時,伺服器先生成json資料。

然後以javascript語法的方式,生成一個function , function名字就是傳遞上來的引數'jsoncallback'的值jsonp1236827957501 .

最後將json資料直接以入參的方式,放置到function中,這樣就生成了一段js語法的文件,返回給客戶端。

客戶端瀏覽器,解析script標籤,並執行返回的javascript文件,此時javascript文件資料,作為引數,

傳入到了客戶端預先定義好的callback函式(如上例中jquery $.ajax()方法封裝的的success: function (json)).(動態執行回撥函式)

可以說jsonp的方式原理上和是一致的(qq空間就是大量採用這種方式來實現跨域資料交換的) .JSONP是一種指令碼注入(Script Injection)行為,所以也有一定的安全隱患.


來源:MaYiXue的部落格——http://blog.sina.com.cn/lfhc1025