jQuery ajax跨域請求的解決方法


  在Ajax應用中,jQuery的Ajax請求是非常容易而且方便的,但是初學者經常會犯一個錯誤,那就是Ajax請求的url不是本地或者同一個服務器下面的URI,最后導致雖然請求200,但是不會返回任何數據,事實上簡單來說請求同一個域名下的url或者說用不帶http的絕對路徑和相對路徑請求是沒有任何問題的,如果請求外部資源,那么這就稱為跨域請求。

  由於安全性的問題,瀏覽器默認不支持跨域調用,晚上也有很多方法,各有優缺點,但是有一個比較好的解決方法這也是jQuery1.2之后官方推薦的,那就是在客戶端和服務端同時加參數,這樣雙方都是信任的那么瀏覽器就不會阻止了,舉個例子:

  先看客戶端代碼:

1 $.getJSON("http://domain/home/join/test?jsoncallback=?",{"from":$("#homecity_name").val(),"to":$("#getcity_name").val(),"time":$("#time").val()},function(result){
2                 if(result == "pass"){
3                     //具體操作
4                     return true;
5                 }
6             });

  不必關心參數和回調等細節,主要看請求的URI中,多了個參數jsoncallback=?,就這么簡單,其他完全不變

  然后看服務端:

1 public function test(){
2         $ajax = I('get.jsoncallback');
3         echo $ajax."('pass')";
4     }

  其他的邏輯也不用考慮,主要看先通過get獲取jsoncallback參數的值,然后返回jsoncallback值開頭的json數據格式,而這個jsoncallback參數的值是變化的,最終正好的服務端返回的一致,所以最終獲得回調數據,這里只是簡單的例子,實際上返回值還可以寫成:$ajax."('name':'value'....)";這種格式

  那么請求地址是:http://domain/home/join/test?jsoncallback=jQuery111107590998236555606_1445756963910&from=%E4%B8%8A%E6%B5%B7&to=%E5%B9%BF%E5%B7%9E&time=2015-10-25&_=1445756963911

  這里的參數是:jsoncallback=jQuery111107590998236555606_1445756963910

  那么回調結果就是:jQuery111107590998236555606_1445756963910('pass')

  現在原理就清楚了吧,實際上我們並不需要關心jsoncallback的值,我們使用返回值的方法還是不變,這只是瀏覽器和服務器之間的一種跨域交互方式

 

  繼續補充:如果是我們用底層的ajax方法請求后台json數據時,寫法可以如下:

 1 $.ajax({
 2     type:"get",    //請求方式
 3     async:true,    //是否異步
 4     url:"http://www.domain.net/url",
 5     dataType:"jsonp",    //跨域json請求一定是jsonp
 6     jsonp: "callbackparam",    //跨域請求的參數名,默認是callback
 7         //jsonpCallback:"successCallback",    //自定義跨域參數值,回調函數名也是一樣,默認為jQuery自動生成的字符串
 8     data:{"query":"civilnews"},    //請求參數
 9 
10     beforeSend: function() {
11         //請求前的處理
12     },
13 
14     success: function(data) {
15         //請求成功處理,和本地回調完全一樣
16     },
17 
18     complete: function() {
19         //請求完成的處理
20     },
21 
22     error: function() {
23         //請求出錯處理
24     }
25 });

 

  這就是用ajax請求的具體方法,其他的使用都完全一樣,服務端返回json數據要用小括號包圍,例如本例用php可以這樣寫:

echo $_GET['callbackparam']."(".json_encode($result_array).")";

  這樣返回就行了,其余都一樣

  到這里,高層的get,getJSON和底層的ajax跨域請求,都能很容易的解決了

 


免責聲明!

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



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