<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        探秘ajax跨域請求

        來源:懂視網 責編:小采 時間:2020-11-27 22:52:08
        文檔

        探秘ajax跨域請求

        探秘ajax跨域請求:前言 ajax,用蒼白的話贊揚:很好。 我們可以使用ajax實現異步獲取數據,減少服務器運算時間,大大地改善用戶體驗;我們可以使用ajax實現小系統組合大系統;我們還可以使用ajax實現前端的優化。(好一個排比) 雖然ajax很好,但在使用起來也會有一定的限制,
        推薦度:
        導讀探秘ajax跨域請求:前言 ajax,用蒼白的話贊揚:很好。 我們可以使用ajax實現異步獲取數據,減少服務器運算時間,大大地改善用戶體驗;我們可以使用ajax實現小系統組合大系統;我們還可以使用ajax實現前端的優化。(好一個排比) 雖然ajax很好,但在使用起來也會有一定的限制,

        前言

        ajax,用蒼白的話贊揚:很好。

        我們可以使用ajax實現異步獲取數據,減少服務器運算時間,大大地改善用戶體驗;我們可以使用ajax實現小系統組合大系統;我們還可以使用ajax實現前端的優化。(好一個排比)

        雖然ajax很好,但在使用起來也會有一定的限制,出于安全考慮,不允許跨域通信。如果嘗試從不同的域請求數據,會出現安全錯誤。(下面例子1可以直觀看出)

        同源策略限制

        同源策略阻止從一個域上加載的腳本獲取或操作另一個域上的文檔屬性。也就是說,受到請求的 URL 的域必須與當前 Web 頁面的域相同。這意味著瀏覽器隔離來自不同源的內容,以防止它們之間的操作。這個瀏覽器策略很舊,從 Netscape Navigator 2.0 版本開始就存在。——摘自developerWorks
        所謂同源是指,域名,協議,端口相同。

        平地一聲吼

        本文講解的是怎么利用ajax實現跨域請求,那么知道“同源策略”,就可以解決很多疑問:“為毛我的ajax加載不了數據!”“為毛瀏覽器控制臺會對我如此漂亮的代碼報錯!”

        例子1
        先上一個錯誤示范

        客戶端代碼:

        代碼如下:
        <script>
            // 客戶端使用getJSON方法請求另一臺機子上的腳本
            $.getJSON("http://172.22.22.120/new/ajax.php",function(json){
                alert(json.website);
            });
        </script>

        服務端PHP腳本代碼:

        代碼如下:
        <?php
            // ajax.php
            header('Content-type: application/json');

            echo json_encode(array('website'=>'hcoding'));
        ?>

        firefox下的錯誤提示:

        根據同源策略的概念,localhost和172.22.22.120是出于不同的域名下的,所以跨域請求理所當然地被瀏覽器拒絕了。

        JSONP

        JSONP(JSON with Padding)是資料格式 JSON 的一種“使用模式”,可以讓網頁從別的網域要資料。另一個解決這個問題的新方法是跨來源資源共享。由于同源策略,一般來說位于 server1.example.com 的網頁無法與不是 server1.example.com 的服務器溝通,而 HTML 的 <script> 元素是一個例外。利用 <script> 元素的這個開放策略,網頁可以得到從其他來源動態產生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料并不是 JSON,而是任意的 JavaScript,用 JavaScript 直譯器執行而不是用 JSON 解析器解析。——摘自維基百科
        這話該怎么理解呢!我個人是這樣認為的,用<script>跨域的請求數據,跨域的服務器返回一段【JavaScript代碼】,是 的,你沒看錯,不是json格式數據,是JavaScript代碼,這樣,這段代碼就由JavaScript 直譯器執行。上例子更直觀:

        例子2
        客戶端代碼:

        代碼如下:
        <script>
            // 這是回調方法
            function cb(data){
                alert(data.website);
            }
        </script>
        <!--這是跨域請求的代碼,切記,這段代碼要在回調函數之后-->
        <script src="http://172.22.22.120/new/ajax_jsonp.php?callback=cb"></script>

        服務端PHP腳本代碼:

        代碼如下:
        <?php
            $cb = htmlspecialchars($_GET['callback']);  // 注意了,這里要做好過濾,防止xss攻擊
            echo $cb,'(',json_encode(array('website'=>'hcoding')),')';  // 返回客戶端的數據為:cb({"name":"hcoding"})  這是一段js代碼
        ?>

        瀏覽器會發生什么事呢,我就不說了,當然是cb方法被調用啦:

        所以,再說jsonp的概念,利用<script>不受同源策略的限制,跨域的服務器把要返回的json數據作為參數和回調函數一起返回客戶端。

        JQuery對JSONP的支持

        本文要講ajax的跨域請求,前面說了那么多,下面當然要講主題啦。

        從 1.2 版本開始,jQuery 擁有對 JSONP 回調的本地支持。如果指定了 JSONP 回調,就可以加載位于另一個域的 JSON 數據,回調的語法為:url?callback=?。jQuery 自動將 ? 替換為要調用的生成函數名。

        例子3:$.getJSON方法跨域請求
        例子4:$.ajax方法自定義回調方法
        例子3
        客戶端代碼:

        代碼如下:
        <script>
            // 客戶端使用getJSON方法請求另一臺機子上的腳本
            // 瀏覽器會生成一個隨機的callback參數
            $.getJSON("http://172.22.22.120/new/ajax_jsonp.php?callback=?",function(json){
                alert(json.website);
            });
        </script>

        服務端PHP腳本代碼:

        代碼如下:
        <?php
            $cb = htmlspecialchars($_GET['callback']);  // 注意了,這里要做好過濾,防止xss攻擊
            echo $cb,'(',json_encode(array('website'=>'hcoding')),')';  // 返回客戶端的數據,這是一段js代碼
        ?>

        $.getJSON簡單易用,但就是不能指定回調函數。

        例子4
        客戶端代碼:

        代碼如下:
        <script>
            $.ajax({
                type : "GET",
                url : "http://172.22.22.120/new/ajax_jsonp.php",
                dataType : "jsonp",    // 數據格式指定為jsonp
                jsonp: "callback",     // 服務點通過這個鍵值獲取回調方法
                jsonpCallback:"cb",   // 指定回調方法
                success : function(json){
                },
            }); 
            // 回調方法
            function cb(data){
                alert(data.website);
            }
        </script>

        服務端PHP腳本代碼和例子3的相同。

        總結

        正所謂無規矩不成方圓,以安全為出發點,遵循同源策略是一個好品德。但我們也有跨域請求的需求,jsonp就能滿足我們的需求。當然跨域請求還有很多的方法,不單止jsonp。

        以上所述就是本文的全部內容了,希望大家能夠喜歡。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        探秘ajax跨域請求

        探秘ajax跨域請求:前言 ajax,用蒼白的話贊揚:很好。 我們可以使用ajax實現異步獲取數據,減少服務器運算時間,大大地改善用戶體驗;我們可以使用ajax實現小系統組合大系統;我們還可以使用ajax實現前端的優化。(好一個排比) 雖然ajax很好,但在使用起來也會有一定的限制,
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产亚洲精品2021自在线| 亚洲精品美女视频| 亚洲av无码专区在线观看下载| 91九色精品国产免费| 亚洲一卡2卡3卡4卡国产网站| 18未年禁止免费观看| 亚洲欧洲日产国码www| 亚洲网站在线免费观看| 亚洲va乱码一区二区三区| 野花高清在线观看免费3中文 | 在线观看亚洲天天一三视| 日韩大片在线永久免费观看网站| 亚洲av日韩av欧v在线天堂| 日韩在线观看免费完整版视频| 亚洲精品成人网久久久久久| 久久久久国色AV免费观看| 亚洲国产AV无码专区亚洲AV| 99视频精品全部免费观看| 亚洲国产日产无码精品| 18禁成年无码免费网站无遮挡| 亚洲日韩av无码中文| 亚洲高清免费视频| 国产午夜不卡AV免费| 亚洲成人黄色在线观看| 在线成人a毛片免费播放| 丰满妇女做a级毛片免费观看| 亚洲日韩中文在线精品第一| 免费在线看污视频| 亚洲国产成人超福利久久精品 | 五月天婷亚洲天综合网精品偷| eeuss影院免费92242部| 日本亚洲欧洲免费天堂午夜看片女人员 | 国产又大又长又粗又硬的免费视频| 无码 免费 国产在线观看91| 国产亚洲精品a在线观看app| 国产91色综合久久免费分享| 精品一区二区三区免费毛片| 亚洲AV人无码激艳猛片| 香蕉视频在线观看免费国产婷婷| 久久av免费天堂小草播放| 亚洲丰满熟女一区二区v|