亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入分析JSONP跨域的原理

2019-11-20 13:46:20
字體:
來源:轉載
供稿:網友

JavaScript是一種在Web開發中經常使用的前端動態腳本技術。在JavaScript中,有一個很重要的安全性限制,被稱為“Same- Origin Policy”(同源策略)。這一策略對于JavaScript代碼能夠訪問的頁面內容做了很重要的限制,即JavaScript只能訪問與包含它的文檔 在同一域下的內容。

JavaScript這個安全策略在進行多iframe或多窗口編程、以及Ajax編程時顯得尤為重要。根據這個策略,在baidu.com下的 頁面中包含的JavaScript代碼,不能訪問在google.com域名下的頁面內容;甚至不同的子域名之間的頁面也不能通過JavaScript代 碼互相訪問。對于Ajax的影響在于,通過XMLHttpRequest實現的Ajax請求,不能向不同的域提交請求,例如,在 abc.example.com下的頁面,不能向def.example.com提交Ajax請求,等等。

然而,當進行一些比較深入的前端編程的時候,不可避免地需要進行跨域操作,這時候“同源策略”就顯得過于苛刻。JSONP跨域GET請求是一個常用的解決方案,下面我們來看一下JSONP跨域是如何實現的,并且探討下JSONP跨域的原理。

利用在頁面中創建<script>節點的方法向不同域提交HTTP請求的方法稱為JSONP,這項技術可以解決跨域提交Ajax請求的問題。JSONP的工作原理如下所述:

假設在http://example1.com/index.php這個頁面中向http://example2.com /getinfo.php提交GET請求,我們可以將下面的JavaScript代碼放在http://example1.com/index.php這 個頁面中來實現:

復制代碼 代碼如下:

var eleScript= document.createElement("script");
eleScript.type = "text/javascript";
eleScript.src = "document.getElementsByTagName("HEAD")[0].appendChild(eleScript);

當GET請求從http://example2.com/getinfo.php返回時,可以返回一段JavaScript代碼,這段代碼會自動執行,可以用來負責調用http://example1.com/index.php頁面中的一個callback函數。

JSONP的優點是:它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中 都可以運行,不需要XMLHttpRequest或ActiveX的支持;并且在請求完畢后可以通過調用callback的方式回傳結果。

JSONP的缺點則是:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題。

再來一個例子:

復制代碼 代碼如下:

var qsData = {'searchWord':$("#searchWord").attr("value"),'currentUserId':
$("#currentUserId").attr("value"),'conditionBean.pageSize':$("#pageSize").attr("value")};
$.ajax({
    async:false,
    url: http://跨域的dns/document!searchJSONResult.action,
    type: "GET",
    dataType: 'jsonp',
    jsonp: 'jsoncallback',
    data: qsData,
    timeout: 5000,
    beforeSend: function(){
        //jsonp 方式此方法不被觸發.原因可能是dataType如果指定為jsonp的話,就已經不是ajax事件了
    },
    success: function (json) {//客戶端jquery預先定義好的callback函數,成功獲取跨域服務器上的json數據后,會動態執行這個callback函數
        if(json.actionErrors.length!=0){
            alert(json.actionErrors);
        }
        genDynamicContent(qsData,type,json);
    },
    complete: function(XMLHttpRequest, textStatus){
        $.unblockUI({ fadeOut: 10 });
    },
    error: function(xhr){
        //jsonp 方式此方法不被觸發.原因可能是dataType如果指定為jsonp的話,就已經不是ajax事件了
        //請求出錯處理
        alert("請求出錯(請檢查相關度網絡狀況.)");
    }
});

有時也會看到這樣的寫法:

復制代碼 代碼如下:

$.getJSON("http://跨域的dns/document!searchJSONResult.action?name1="+value1+"&jsoncallback=?",
    function(json){
    if(json.屬性名==值){
        // 執行代碼
    }
});

這種方式其實是上例$.ajax({..}) api的一種高級封裝,有些$.ajax api底層的參數就被封裝而不可見了。

這樣,jquery就會拼裝成如下的url get請求:

復制代碼 代碼如下:

http://跨域的dns/document!searchJSONResult.action?&jsoncallback=jsonp1236827957501&_=1236828192549&searchWord=
%E7%94%A8%E4%BE%8B¤tUserId=5351&conditionBean.pageSize=15

在響應端(http://跨域的dns/document!searchJSONResult.action),通過 jsoncallback = request.getParameter("jsoncallback") 得到jquery端隨后要回調的js function name:jsonp1236827957501 然后 response的內容為一個Script Tags:"jsonp1236827957501("+按請求參數生成的json數組+")"; jquery就會通過回調方法動態加載調用這個js tag:jsonp1236827957501(json數組); 這樣就達到了跨域數據交換的目的。

JSONP原理

JSONP的最基本的原理是:動態添加一個<script>標簽,而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)傳給服務器。注意:服務端得到callback的數值后,要用 jsonp1236827957501(......)把將要輸出的json內容包括起來,此時,服務器生成 json 數據才能被客戶端正確接收。

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

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

客戶端瀏覽器,解析script標簽,并執行返回的 javascript 文檔,此時javascript文檔數據,作為參數, 傳入到了客戶端預先定義好的 callback 函數(如上例中jquery $.ajax()方法封裝的的success: function (json))里。

可以說jsonp的方式原理上和<script src="http://跨域/...xx.js"></script>是一致的(qq空間就是大量采用這種方式來實現跨域數據交換 的)。JSONP是一種腳本注入(Script Injection)行為,所以有一定的安全隱患。

jquery為什么不支持post方式跨域呢?

雖然采用post+動態生成iframe是可以達到post跨域的目的(有位js牛人就是這樣把jquery1.2.5 打patch的),但這樣做是一個比較極端的方式,不建議采用。

也可以說get方式的跨域是合法的,post方式從安全角度上,被認為是不合法的,萬不得已還是不要劍走偏鋒。

client端跨域訪問的需求看來也引起w3c的注意了,看資料說html5 WebSocket標準支持跨域的數據交換,應該也是一個將來可選的跨域數據交換的解決方案。

來個超簡單的例子:

復制代碼 代碼如下:

其中 jsonCallback 是客戶端注冊的,獲取跨域服務器上的json數據后,回調的函數。http://crossdomain.com /jsonServerResponse?jsonp=jsonpCallback 這個 url 是跨域服務器取 json 數據的接口,參數為回調函數的名字,返回的格式為:jsonpCallback({msg:'this is json data'})

簡述原理與過程:首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器。此時,服務器先生成 json 數據。 然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數 jsonp。最后將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。

客戶端瀏覽器,解析script標簽,并執行返回的 javascript 文檔,此時數據作為參數,傳入到了客戶端預先定義好的 callback 函數里。(動態執行回調函數)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一区中文99精品| 久久久久中文字幕| 日韩大陆毛片av| 夜夜躁日日躁狠狠久久88av| 高清欧美性猛交| 久久亚洲精品成人| 国产亚洲免费的视频看| 97在线视频免费观看| 久久69精品久久久久久久电影好| 麻豆一区二区在线观看| 国产丝袜一区视频在线观看| 欧美怡红院视频一区二区三区| 国产噜噜噜噜噜久久久久久久久| 国产精品久久中文| 国产精品27p| 亚洲色图在线观看| 久久精品91久久香蕉加勒比| 亚洲人午夜精品免费| 91精品视频一区| 成人网址在线观看| 国产免费一区二区三区在线能观看| 亚洲综合社区网| 九色91av视频| 国产精品www色诱视频| 51午夜精品视频| 欧美午夜无遮挡| 午夜免费在线观看精品视频| 日韩大片在线观看视频| 国产精品青青在线观看爽香蕉| 久久99精品国产99久久6尤物| 久久国内精品一国内精品| 精品国产乱码久久久久酒店| 5252色成人免费视频| 91av在线网站| 中文字幕久热精品在线视频| 亚洲一区二区福利| 亚洲国产精品电影在线观看| 少妇激情综合网| 中文字幕久热精品视频在线| 中文字幕亚洲情99在线| 亚洲人成网站999久久久综合| 精品国产拍在线观看| 亚洲偷欧美偷国内偷| 欧美日韩一区二区免费视频| 亚洲色图av在线| 亚洲最大av在线| 欧美久久精品午夜青青大伊人| 亚洲性无码av在线| 欧美激情第6页| 国模私拍一区二区三区| 日本欧美一二三区| 久久免费成人精品视频| 国产精品男女猛烈高潮激情| 欧美丝袜美女中出在线| 日韩国产欧美精品一区二区三区| 欧美国产在线视频| 成人欧美一区二区三区在线湿哒哒| 一区二区三区回区在观看免费视频| 2021久久精品国产99国产精品| 亚洲视频自拍偷拍| 欧美日韩性视频| 欧美日韩国产123| 美女扒开尿口让男人操亚洲视频网站| 国产精品青草久久久久福利99| 伊人久久久久久久久久久| 国产精品免费一区| 精品动漫一区二区| 日韩电影在线观看永久视频免费网站| 欧美在线视频观看| 国产视频精品xxxx| 欧美色视频日本版| 久久久久久久久亚洲| 伊人精品在线观看| 精品美女久久久久久免费| 欧美一级视频在线观看| 国产91在线播放九色快色| 日本国产高清不卡| 日韩一二三在线视频播| 欧洲永久精品大片ww免费漫画| 久久国产加勒比精品无码| 精品久久久久久中文字幕| 不卡伊人av在线播放| 97精品在线观看| 亚洲精品福利资源站| 欧美日韩国产在线播放| 91精品国产乱码久久久久久久久| 欧美丰满少妇xxxxx| 色一情一乱一区二区| 精品久久久999| 国产精品国产亚洲伊人久久| 欧美一级视频一区二区| 91精品国产91久久久久久久久| 欧美午夜精品久久久久久浪潮| 国产在线高清精品| 亚洲天堂av综合网| 国产91色在线|免| 国产噜噜噜噜久久久久久久久| 在线精品91av| 久久人91精品久久久久久不卡| 欧美成人免费视频| 97精品欧美一区二区三区| 97人人做人人爱| 亚洲视频一区二区| 午夜精品一区二区三区在线视| 韩国19禁主播vip福利视频| 欧美小视频在线观看| 不用播放器成人网| 国内精品小视频| 国产精品igao视频| 欧美极度另类性三渗透| 久久久久久久久久亚洲| 92裸体在线视频网站| 亚洲在线观看视频网站| 国产亚洲欧美日韩一区二区| 91在线|亚洲| 欧美激情在线狂野欧美精品| 亚洲美女在线观看| 成人精品在线视频| 久久6精品影院| 国产精品mp4| 九九热精品在线| 国产精品草莓在线免费观看| 中文字幕亚洲欧美日韩在线不卡| 丝袜美腿亚洲一区二区| 国产一区二区三区欧美| 国产精品麻豆va在线播放| 色偷偷88888欧美精品久久久| 亚洲电影免费观看高清完整版| www.欧美精品一二三区| 91精品国产色综合久久不卡98| 欧美激情在线狂野欧美精品| 国产精品视频自在线| 欧美午夜宅男影院在线观看| 亚洲精品视频在线播放| 国产精品日韩专区| 国产97在线视频| 亚洲午夜久久久久久久| 国产91ⅴ在线精品免费观看| 久久精品美女视频网站| 视频在线一区二区| 日韩欧美国产视频| 欧美成人性生活| 成人网在线观看| 欧美在线国产精品| yw.139尤物在线精品视频| 国产精品一区二区久久国产| 国产精品第一区| 亚洲国产精品人人爽夜夜爽| 91久久精品久久国产性色也91| 久久男人资源视频| 成人精品一区二区三区电影黑人| 日韩免费在线看| 亚洲国产日韩精品在线| 国产精品日韩专区| 狠狠做深爱婷婷久久综合一区| 亚洲欧美日韩区| 欧美洲成人男女午夜视频| 亚洲第一精品电影| 色诱女教师一区二区三区| 最近2019年中文视频免费在线观看| 亚洲第一页中文字幕| 伊人久久久久久久久久久| 国产97免费视| 国产欧美最新羞羞视频在线观看|