jquery ajax 跨域


客戶端“跨域訪問”一直是一個頭疼的問題,好在有jQuery幫忙,從jQuery-1.2以后跨域問題便迎刃而解。由於自己在項目中遇到跨域問題,借此機會對跨域問題來刨根問底,查閱了相關資料和自己的實踐,算是解決了跨域問題。便記錄下來,以供查閱。 
        jQuery.ajax()支持get方式的跨域,這其實是采用jsonp的方式來完成的。
        真實案例:
        $.ajax({ 
            async:false, 
            url: 'http://www.mysite.com/demo.do',  // 跨域URL
            type: 'GET', 
            dataType: 'jsonp', 
            jsonp: 'jsoncallback', //默認callback
            data: mydata, 
            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 方式此方法不被觸發
                //請求出錯處理 
                alert("請求出錯(請檢查相關度網絡狀況.)"); 
            } 
        });

        注意:
        $.getJSON(" http://www.mysite.com/demo.do?name1="+value1+"&callback=?", 
            function(json){ 
                if(json.屬性名==值){ 
                    // 執行代碼 
                } 
        }); 
    這種方式其實是上例$.ajax({..}) api的一種高級封裝,有些$.ajax api底層的參數就被封裝而不可見了。

    在服務端通過callback= request.getParameter("callback") 得到jQuery端隨后要回調的jsonp32440980
    然后返回類似:"jsonp32440980("+要返回的json數組+")"; 
    jquery就會通過回調方法動態加載調用這個:jsonp32440980(json數組);
    這樣就達到了跨域數據交換的目的. 
    jsonp的最基本的原理是:動態添加一個是一致的(qq空間就是大量采用這種方式來實現跨域數據交換的) 。JSONP是一種腳本注入(Script Injection)行為,所以也有一定的安全隱患。
    注意:jquey是不支持post方式跨域的。
    這是因為雖然采用post +動態生成iframe是可以達到post跨域的目的(有位js牛人就是這樣把jquery1.2.5 打patch的),但這樣做是一個比較極端的方式,不建議采用。也可以說get方式的跨域是合法的,post方式從安全角度上被認為是不合法的,萬不得已 還是不要post,client端跨域訪問的需求看來也引起w3c的注意了,看資料說html5 WebSocket標准支持跨域的數據交換,應該也是一個將來可選的跨域數據交換的解決方案。
參考:http://www.jb51.net/article/21213.htm


免責聲明!

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



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