jsonp 跨域Uncaught SyntaxError: Unexpected token :解決方法


[jQuery]Ajax實現跨域訪問JSON

Ajax跨域訪問JSON

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

因為在跨域實現,所以這里新建網站,這個網站只需要Ashx文件

public void ProcessRequest(HttpContext context)

{

string  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"}]";

context.Response.Write(strJson);   

}

 

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

 

vs中再建網站項目Web_Client,用於跨域訪問Web_DataSource。

 

(一)  正常的JqueryAajx跨域請求

function jsonajax() {

    $.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請求

function jsonpajax() {

    $.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)

{

string 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"}]";

string callback = 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的形式實現跨域訪問JSONP即JSON with Padding。由於同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、端口)的資源。如果要進行跨域請求,我們可以通過使用html的script標記來進行跨域請求,並在響應中返回要執行的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)行為,所以也有一定的安全隱患.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM