国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

jsonp 跨域原理分析

scq000 / 2118人閱讀

摘要:為請求指定一個回調函數名。這主要用來讓生成一個獨特的函數名,這樣管理請求更容易,也能方便地提供回調函數和錯誤處理。在回調函數中,通常我們只需通過判斷請求是否完成,如果已完成,再根據判斷是否是一個成功的響應。

本篇文章借鑒自 博客園文章
原文地址

AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML),是指一種創建交互式網頁應用的網頁開發技術。

AJAX 的出現使得網頁可以通過在后臺與服務器進行少量數據交換,實現網頁的局部刷新。

但是出于安全的考慮,ajax不允許跨域通信(瀏覽器同源策略)。
如果嘗試從不同的域請求數據,就會出現錯誤(跨域錯誤)。
在實際開發中,往往需要進行跨于請求,這時要怎么辦呢?

關于ajax跨域請求?

1、Ajax為什么不能跨域?到底是卡在哪個環節了?。 (請求成功了,但客戶端瀏覽器拿不到請求結果)

Ajax其實就是向服務器發送一個GET或POST請求,然后取得服務器響應結果,返回客戶端。

理論上這是沒有任何問題的,然而普通ajax跨域請求,在服務器端不會有任何問題,只是服務端響應數據返回給瀏覽器的時候,

瀏覽器根據響應頭的Access-Control-Allow-Origin字段的值來判斷是否有權限獲取數據,

一般情況下,服務器端如果沒有在這個字段做特殊處理的話,跨域是沒有權限訪問的,所以響應數據被瀏覽器給攔截了,

所以在ajax回調函數里是獲取不到數據的。所以現在ajax跨域的問題可以轉化為數據怎么拿回客戶端的問題。

2、 html的script標簽,img標簽,iframe標簽,可以請求第三方的資源(不受同源策略影響)

web頁面可以加載放在任意站點的js、css、圖片等資源,不會受到"跨域"的影響。

這個時候,我們會想到:既然我們可以調用第三方站點的js,那么如果我們將數據放到第三方站點的js中不就可以將數據帶到客戶端了嗎?
JSONP

1、什么是JSONP?

JSONP(JSON with Padding(填充))是JSON的一種“使用模式”,可用于解決主流瀏覽器的跨域數據訪問的問題。

其核心思想是利用JS標簽里面的跨域特性進行跨域數據訪問,
在JS標簽里面存在的是一個跨域的URL,實際執行的時候通過這個URL獲得一段字符串,
這段返回的字符串必須是一個合法的JS調用,通過EVAL這個字符串來完成對獲得的數據的處理。

即: 

JSONP是一個非官方的協議,它允許在服務器端集成Script tags返回至客戶端,
通過javascript callback的形式實現跨域訪問(這僅僅是JSONP簡單的實現形式)。

2、JSONP的粗糙實現

下面我們通過一個例子來說明一下JSONP是如何實現ajax跨域請求的。

html 代碼



    
    Title


    
jsonp
遠程的getdata.js
getremotedata({
    code:0,
    result:"success"
});

得到的結果:

jsonp前端及后臺php的寫法

html代碼還是和上面一樣,只要改變 url就可以了
url= "localhsot:8080/search.php?callback=getremotedata"

后臺 php 代碼
    

看到這里清楚了吧,就是第三方站點生成一個對回調函數的調用,傳入查詢結果,
然后通過

jquery 封裝在 ajax方法 里面的jsonp

jquery 是如何把 jsonp 封裝到ajax里面的?

一般情況下jqury 生成的訪問 遠程站點的 url
默認情況下:(我所在的實際項目中的使用)

http://web.k3k.net/haila3/pt/tp/index.php/Home/User/getusergoto/?callback=jQuery191028614189839964865_1497261919344&token=420171c8-031a58667e64&_=1497261919346

上述代碼請求生成的url(設置 jsonpCallback的值為 GetData

http://web.k3k.net/haila3/pt/tp/index.php/Home/User/getusergoto/?callback=GetData&token=420171c8-00b8-031a58667e64&_=1497261919346

最后 一個 _=1497261919346 k v 是為了防止瀏覽器緩存,而由 jquery 自動增加上的。

所以相當于 在 前端文件中引入了 一個這樣的js文件

這里有2個重要的參數

jsonp
在一個jsonp請求中重寫回調函數的名字。這個值用來替代在"callback=?"這種GET或POST請求中URL參數里的"callback"部分,
比如{jsonp:"onJsonPLoad"}會導致將"onJsonPLoad=?"傳給服務器。

jsonpCallback
為jsonp請求指定一個回調函數名。這個值將用來取代jQuery自動生成的隨機函數名。
這主要用來讓jQuery生成一個獨特的函數名,這樣管理請求更容易,也能方便地提供回調函數和錯誤處理。

你也可以在想讓瀏覽器緩存GET請求的時候,指定這個回調函數名。

從jQuery 1.5開始,你也可以使用一個函數作為該參數設置,在這種情況下,該函數的返回值就是jsonpCallback的結果。

通過一開始 jsonp 原理的分析,可以得出:

當我們正常地請求一個JSON數據的時候,服務端返回的是一串JSON類型的數據。
而我們使用JSONP模式來請求數據的時候,服務端返回的是一段可執行的JavaScript代碼

所以我們可見服務器代碼最后一行

echo $_GET["$callback"])."(". json_encode({code:0,msg:"success"}) .")";

就是執行的 getdata,然后把數據通過回調的方式傳遞過去

OK,就是整個流程就是:

客戶端發送一個請求,規定一個可執行的函數名
(這里就是jQuery做了封裝的處理,自動幫你生成回調函數并把數據取出來供success屬性方法來調用,不是傳遞的一個回調句柄),
服務端接受了這個 getdata 函數名,然后把數據通過實參的形式發送出去

以上是 jquery 封裝的 ajax方法里面的 jsonp 請求,說來說去,自己都好像忘記了普通的 ajax請求

js原生 ajax 請求
        //1.創建對象
        var ajax = "";

        if(window.XMLHttpRequest){
            ajax = new XMLHttpRequest();    /* 現代瀏覽器 */
        }else if(window.ActiveXObject){
            ajax = new ActiveXObject("Microsoft.XMLHTTP");  /* 萬惡的ie瀏覽器 */
        }

        //2.創建請求

        //get請求方法(拼接url參數)
//      var url="login.php?name="+name+"&password="+pass;
//      ajax.open("GET",url,true);

        //post請求
        ajax.open("POST","login.php",true);
        ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        var data="name="+name+"&password="+pass;

        //3.發送請求
//      ajax.send();        //get 方式發送請求
        ajax.send(data);    //post 方式發送請求

        //4.捕獲請求狀態、onreadystatechange表示當前請求狀態

        ajax.onreadystatechange=function(){
            //5.判斷請求狀態
            if(ajax.readyState==4){
                //6.判斷請求結果
                if(ajax.status==200){
                    //請求成功將結果 responseText 放入回調函數中
                    succ(ajax.responseText);
                }
            }
        }

注意

通過檢測window對象是否有XMLHttpRequest屬性來確定瀏覽器是否支持標準的XMLHttpRequest。
注意,不要根據瀏覽器的navigator.userAgent來檢測瀏覽器是否支持某個JavaScript特性,一是因為這個字符串本身可以偽造,二是通過IE版本判斷JavaScript特性將非常復雜。

當創建了XMLHttpRequest對象后,要先設置onreadystatechange的回調函數。在回調函數中,通常我們只需通過readyState === 4判斷請求是否完成,
如果已完成,再根據status === 200判斷是否是一個成功的響應。

XMLHttpRequest對象的open()方法有3個參數,
第一個參數指定是GET還是POST,
第二個參數指定URL地址,
第三個參數指定是否使用異步,默認是true,所以不用寫。

注意,千萬不要把第三個參數指定為false,否則瀏覽器將停止響應,直到AJAX請求完成。
如果這個請求耗時10秒,那么10秒內你會發現瀏覽器處于“假死”狀態。

最后調用send()方法才真正發送請求。
GET請求不需要參數,
POST請求需要把body部分以字符串或者FormData對象傳進去。

jquery實現普通ajax

后臺 php 代碼

當然實現跨域的方法還有很多,html5規范 的 CORS(全稱Cross-Origin Resource Sharing),是HTML5規范定義的如何跨域訪問資源。

了解CORS前,我們先搞明白概念:
Origin表示本域,也就是瀏覽器當前頁面的域。當JavaScript向外域(如sina.com)
發起請求后,瀏覽器收到響應后,首先檢查Access-Control-Allow-Origin是否包含本域,
如果是,則此次跨域請求成功,如果不是,則請求失敗,JavaScript將無法獲取到響應的任何數據。

假設本域是my.com,外域是sina.com,只要響應頭Access-Control-Allow-Origin為http://my.com,或者是*,本次請求就可以成功。

可見,跨域能否成功,取決于對方服務器是否愿意給你設置一個正確的Access-Control-Allow-Origin,決定權始終在對方手中。
總結

1、ajax和jsonp這兩種技術在調用方式上“看起來”很像,目的也一樣,都是請求一個url,然后把服務器返回的數據進行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進行了封裝;

2、ajax和jsonp其實本質上是不同的東西。ajax的核心是通過XMLHttpRequest獲取非本頁內容,而jsonp的核心則是通過HTTP來動態添加

閱讀需要支付1元查看
<