1. 程式人生 > >Jquery之AJAX COOKIES跨域請求

Jquery之AJAX COOKIES跨域請求

 在開發中,開發人員應該都知道js在操作cookie時是不允許跨域處理的,那麼怎麼辦呢?利用Jquery之AJAX 跨域請求 - 其中有一個方法 JSONP 可以實現跨域請求。     JQuery對於Ajax的跨域請求有兩類解決方案,不過都是隻支援get方式。分別是JQuery的 jquery.ajax jsonp格式和jquery.getScript方式。 什麼是jsonp格式呢?API原文是:
如果獲取的資料檔案存放在遠端伺服器上(域名不同,也就是跨域獲取資料),則需要使用jsonp型別。使用這種型別的話,會建立一個查詢字串引數 callback=? ,這個引數會加在請求的URL後面。伺服器端應當在JSON資料前加上回調函式名,以便完成一個有效的JSONP請求。意思就是遠端服務端需要對返回的資料做下處理,根據客戶端提交的callback的引數,返回一個callback(json)的資料,而客戶端將會用script的方式處理返回資料,來對json資料做處理。JQuery.getJSON也同樣支援jsonp的資料方式呼叫。      先跟著飄易看看一個測試的案例:
     前端HTML程式碼是(先引用jquery庫):
<script type="text/javascript" src="jquery.min.js"></script>
     <script type="text/javascript">
    jQuery(document).ready(function(){
        $.ajax({
            type : "get",
            async:false,
            url : "http://www.piaoyi.org/json.php",
            dataType : "jsonp",
            jsonp: "callback",//傳遞給請求處理程式或頁面的,用以獲得jsonp回撥函式名的引數名(預設為:callback)
            jsonpCallback:"success_jsonpCallback",//自定義的jsonp回撥函式名稱,預設為jQuery自動生成的隨機函式名
            success : function(json){
                document.writeln(json.name+"<br>");
document.writeln(json.age+"<br>");
            },
            error:function(){
                alert('fail');
            }
        });
    });
    </script>
    後臺伺服器端程式碼,拿PHP舉例:

//服務端返回JSON資料
$arr=array('name'=>'Peter Piaoyi','age'=>25,'city'=>'wuxi');
$result=json_encode($arr);
//動態執行回撥函式
$callback=$_GET['callback'];
if($callback!="") echo $callback."($result)";
else echo "$result";     執行上述前端頁面後,通過抓包,我們可以看到傳送的地址:
Jquery之AJAX  COOKIES跨域請求 - JSONP實現方法     get請求的地址是:http://www.piaoyi.org/json.php?callback=success_jsonpCallback&_=1403140097761
 
    返回的結果是:
success_jsonpCallback({"name":"Peter Piaoyi","age":25,"city":"wuxi"}),從這個返回來看,success_jsonpCallback 正是我們上述程式碼裡定義的jsonpCallback的值。
下面是其他呼叫程式碼示例
如何使用JSONP?
下邊這一DEMO實際上是JSONP的簡單表現形式,在客戶端宣告回撥函式之後,客戶端通過script標籤向伺服器跨域請求資料,然後服務端返回相應的資料並動態執行回撥函式。

HTML程式碼 (任一 ):
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />  
<script type="text/javascript">  
    function jsonpCallback(result) {  
        //alert(result);  
        for(var i in result) {  
            alert(i+":"+result[i]);//迴圈輸出a:1,b:2,etc.  
        }  
    }  
    var JSONP=document.createElement("script");  
    JSONP.type="text/javascript";  
    JSONP.src="http://crossdomain.com/services.php?callback=jsonpCallback";  
    document.getElementsByTagName("head")[0].appendChild(JSONP);  
</script>  

或者

Html程式碼  
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />  
<script type="text/javascript">  
    function jsonpCallback(result) {  
        alert(result.a);  
        alert(result.b);  
        alert(result.c);  
        for(var i in result) {  
            alert(i+":"+result[i]);//迴圈輸出a:1,b:2,etc.  
        }  
    }  
</script>  
<script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>  

JavaScript的連結,必須在function的下面。 如果將上述JS客戶端程式碼用jQuery的方法來實現,也非常簡單。

$.getJSON
$.ajax
$.get

客戶端JS程式碼在jQuery中的實現方式1:
<script type="text/javascript" src="jquery.js"></script>  
<script type="text/javascript">  
    $.getJSON("http://crossdomain.com/services.php?callback=?",  
    function(result) {  
        for(var i in result) {  
            alert(i+":"+result[i]);//迴圈輸出a:1,b:2,etc.  
        }  
    });  
</script>  
  客戶端JS程式碼在jQuery中的實現方式2:
<script type="text/javascript" src="jquery.js"></script>  
<script type="text/javascript">  
    $.ajax({  
        url:"http://crossdomain.com/services.php",  
        dataType:'jsonp',  
        data:'',  
        jsonp:'callback',  
        success:function(result) {  
            for(var i in result) {  
                alert(i+":"+result[i]);//迴圈輸出a:1,b:2,etc.  
            }  
        },  
        timeout:3000  
    });  
</script>  

客戶端JS程式碼在jQuery中的實現方式3:
<script type="text/javascript" src="jquery.js"></script>  
<script type="text/javascript">  
    $.get('http://crossdomain.com/services.php?callback=?', {name: encodeURIComponent('tester')}, function (json) { for(var i in json) alert(i+":"+json[i]); }, 'jsonp');  
</script>  

其中 jsonCallback 是客戶端註冊的,獲取 跨域伺服器 上的json資料 後,回撥的函式。
http://crossdomain.com/services.php?callback=jsonpCallback
這個 url 是跨域服務 器取 json 資料的介面,引數為回撥函式的名字,返回的格式為 jsonpCallback({msg:'this is json data'})  

Jsonp原理: 
首先在客戶端註冊一個callback, 然後把callback的名字傳給伺服器。 此時,伺服器先生成 json 資料。
然後以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的引數 jsonp. 最後將 json 資料直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文件,返回給客戶端。 客戶端瀏覽器,解析script標籤,並執行返回的 javascript 文件,此時資料作為引數,傳入到了客戶端預先定義好的 callback 函式裡.(動態執行回撥函式) 使用JSON的優點在於
比XML輕了很多,沒有那麼多冗餘的東西。
JSON也是具有很好的可讀性的,但是通常返回的都是壓縮過後的。不像XML這樣的瀏覽器可以直接顯示,瀏覽器對於JSON的格式化的顯示就需要藉助一些外掛了。
在JavaScript中處理JSON很簡單。
其他語言例如PHP對於JSON的支援也不錯。
JSON也有一些劣勢:
JSON在服務端語言的支援不像XML那麼廣泛,不過JSON.org上提供很多語言的庫。
如果你使用eval()來解析的話,會容易出現安全問題。
儘管如此,JSON的優點還是很明顯的。他是Ajax資料互動的很理想的資料格式。

主要提示
JSONP 是構建 mashup 的強大技術,但不幸的是,它並不是所有跨域通訊需求的萬靈藥。它有一些缺陷,在提交開發資源之前必須認真考慮它們。

第一,也是最重要的一點,沒有關於 JSONP 呼叫的錯誤處理。如果動態指令碼插入有效,就執行呼叫;如果無效,就靜默失敗。失敗是沒有任何提示的。例如,不能從伺服器捕捉到 404 錯誤,也不能取消或重新開始請求。不過,等待一段時間還沒有響應的話,就不用理它了。(未來的 jQuery 版本可能有終止 JSONP 請求的特性)。

JSONP 的另一個主要缺陷是被不信任的服務使用時會很危險。因為 JSONP 服務返回打包在函式呼叫中的 JSON 響應,而函式呼叫是由瀏覽器執行的,這使宿主 Web 應用程式更容易受到各類攻擊。如果打算使用 JSONP 服務,瞭解它能造成的威脅非常重要。
ajax請求引數說明 dataType  String 預期伺服器返回的資料型別。如果不指定,jQuery 將自動根據 HTTP 包 MIME 資訊來智慧判斷,比如XML MIME型別就被識別為XML。在1.4中,JSON就會生成一個JavaScript物件,而script則會執行這個指令碼。隨後伺服器端返回的資料會根據這個值解析後,傳遞給回撥函式。可用值: "xml": 返回 XML 文件,可用 jQuery 處理。 "html": 返回純文字 HTML 資訊;包含的script標籤會在插入dom時執行。 "script": 返回純文字 JavaScript 程式碼。不會自動快取結果。除非設定了"cache"引數。'''注意:'''在遠端請求時(不在同一個域下),所有POST請求都將轉為GET請求。(因為將使用DOM的script標籤來載入) "json": 返回 JSON 資料 。 "jsonp": JSONP 格式。使用 JSONP 形式呼叫函式時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函式名,以執行回撥函式。 "text": 返回純文字字串 jsonp   String 在一個jsonp請求中重寫回調函式的名字。這個值用來替代在"callback=?"這種GET或POST請求中URL引數裡的"callback"部分,比如{jsonp:'onJsonPLoad'}會導致將"onJsonPLoad=?"傳給伺服器。 jsonpCallback   String 為jsonp請求指定一個回撥函式名。這個值將用來取代jQuery自動生成的隨機函式名。這主要用來讓jQuery生成度獨特的函式名,這樣管理請求更容易,也能方便地提供回撥函式和錯誤處理。你也可以在想讓瀏覽器快取GET請求的時候,指定這個回撥函式名。    ajax jsonp與普通的ajax請求的主要區別在於——請求響應結果的處理。如上面程式碼所示的響應結果為: success_jsonpCallback([ { name:"John"} ] ); ————其實就是,呼叫jsonp回撥函式success_jsonpCallback,並將要響應的字串或json傳入此方法(作為引數值),其底層的實現,大概的猜想應該是:
 function success_jsonpCallback(data)
        {
            success(data);
        }
 經測試,ajax jsonp對同步或非同步請求沒有影響。

相關推薦

JqueryAJAX COOKIES請求

 在開發中,開發人員應該都知道js在操作cookie時是不允許跨域處理的,那麼怎麼辦呢?利用Jquery之AJAX 跨域請求 - 其中有一個方法 JSONP 可以實現跨域請求。     JQuery對於Ajax的跨域請求有兩類解決方案,不過都是隻支援get方式。分別是JQ

jqueryajax處理的三大方式

代碼 new .ajax abs port ole ren make and 一、處理跨域的方式: 1.代理 2.XHR2 HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已經實現了跨域訪問。但ie10以下不支持 只需要在服務端填上響應頭:

jsAjax

color all 異步發送請求 ready 網站 解析 執行 發送 set 一、Ajax 我們對Ajax一定不會陌生,異步發送請求獲取數據,這是我們前端與後臺服務器交互的重要的手段,那麽對於ajax我們需要了解什麽呢? 我們手寫一個ajax

【轉載】Ajax JS 請求

-h 資源 pla dom light data 常用 clas json 原文: 簡單的ajax請求:http://blog.csdn.net/net_lover/article/details/5172509 復雜的ajax請求:http://blog.csdn.net

ajax本地請求以及解決方法

同源策略 AC something 三種 n) req apache2.4 策略 cor 什麽是跨域? ??我們通常所說的跨域是狹義的,是由瀏覽器同源策略限制的一類請求場景。所謂同源是指"協議+域名+端口"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源,只要沒有同

Ajax-jsonp請求簡單樣例

Ajax-jsonp跨域請求說明 1.簡要說明:  跨域的安全限制都是對瀏覽器端來說的,伺服器端是不存在跨域安全限制的。瀏覽器的同源策略限制從一個源載入的文件或指令碼與來自另一個源的資源進行互動。如果協議,埠和主機對於兩個頁面是相同的,則兩個頁面具有相同的源,否則就是不同源的。如果

SpringCloudApiGateway支援Cors請求

問題背景 公司的專案需要前後端分離,vue+java,這時候就需要支援Cors跨域請求了。最近對zuul進行升級,假如說zuul是1.0的話,api gateway就是2.0的閘道器,支援ws等,基於NIO,各方面還是強大的。 解決方案 新建一個Configuration類即

分散式環境Ajax請求

分散式結構優點         在做該系統的過程中,系統的前臺和後臺是分開,但是都使用同一個資料庫,這樣設計架構的優點有:        1、前臺系統和後臺的服務相分離,降低了系統的耦合度。     

JqueryAjax處理的方式

一、處理跨域的方式: 1.代理 2.XHR2 HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已經實現了跨域訪問。但ie10以下不支援 只需要在服務端填上響應頭: header("Access-Control-Allow-

ajax post請求解決

一、使用 response.addHeader(“Access-Control-Allow-Origin”, “*”); 解決1、前端  2、後端:二、使用CORS 解決 1、跨域問題屬於後臺的安全攔截,跟客戶端沒關係,在java後臺,使用cors filter進行攔截處理,

關於ajax進行請求 回撥函式命名的一些問題

通常我們在使用ajax進行 JSONP跨域請求時,不會對回撥函式名稱做限制 ,而是採用系統隨機的命名,類似於jQuery3215844等豁免隨機的產生一些數字,這種方式帶來的一個問題就是每次都會發出一個新的請求連結,對於一些實時性不是很敏感的介面來說,可能只需要

spring mvc ajax jsonp 請求 返回值 配置

背景: AJAX向後臺(springmvc)傳送請求,報錯:已阻止交叉源請求:同源策略不允許讀取 http://127.0.0.1:8080/DevInfoWeb/getJsonp 上的遠端資源。可 以將資源移動到相同的域名上或者啟用 CORS 來解決這個問題。 百度

AJAX cors請求

在PHP檔案上加上 header("Access-Control-Allow-Origin: *"); //全域名 hea

jQuery jsonp請求 ajax---伺服器端代理實現

  ajax跨域之---伺服器端代理實現 https://www.cnblogs.com/lydialee/p/4869145.html   來源   https://www.cnblogs.com/chiangchou/p/jsonp.html

解決jquery ajax訪問post請求的時候,ie9以下無效(包括ie9)的問題

jquery src actor div tick 屬性 dex 啟用 logs 最近在做項目的時候遇到一個問題,就是跨域請求ajax的時候ie9以下的瀏覽器不可以訪問,直接執行error裏面的代碼,但是也不報錯,就上網查了查,發現了一個很好用的方法,在這裏記錄一下,也希望

淺談jquery中的ajax請求請求

bold 錯誤 但是 font 方法 端口 ets 提示 access ajax請求數據的代碼: $(function () { $.ajax({ url:url,//請求文件所在的url type:"get",//請求的方式

jQuery使用ajax請求獲取數據

自動生成 pac 異步 部分 pap class 附加 activex 方便 jQuery使用ajax跨域請求獲取數據 跨域是我在日常面試中經常會問到的問題,這詞在前端界出現的頻率不低,主要原因還是由於安全限制(同源策略, 即JavaScript或Cookie只能訪

JQuery - Ajax和Tomcat請求問題解決方法!

頁面 解析json turn 圖片 fault $.ajax action 配置 span 在JQuery裏面使用Ajax和Tomcat服務器之間進行數據交互,遇到了跨域請求問題,無法成功得到想要的數據! 錯誤信息部分截圖: 通過錯誤信息判斷知道已經發生在Ajax跨域請求

楊老師課堂Jquery的篩選,事件,效果,Ajax,javascript)

1 篩選[掌握]  篩選與之前“選擇器”雷同,篩選提供函式 1.1 過濾 eq(index|-index),獲取第N個元素 •index:一個整數,指示元素基於0的位置,這個元素的位置是從0算起。 •-index:一個整數,指示元素的位置,從集合中的最後一個元素開

ie9 ajax 請求不了 提交為空 jquery-ajaxtransport-xdomainrequest

本問出自: http://blog.csdn.net/wyk304443164 幾種方式: 可以手動修改ie9的允許跨域訪問(不實際) 使用jquery-ajaxtransport-xdomainrequest api這邊 h