【JSONP】JSONP實(shí)現(xiàn)跨域請(qǐng)求

0x01 前言

今天復(fù)習(xí)了一下有關(guān)jsonp相關(guān)的攻防知識(shí),突然發(fā)現(xiàn)自己對(duì)于jsonp的理解只是在書本上的那種,對(duì)于其具體的實(shí)現(xiàn)還是一知半解的,因此寫篇文章記錄一下jsonp的實(shí)現(xiàn)過程,會(huì)附上具體代碼滴~

0x02 JSONP的概念

那么什么是JSONP呢,在理解JSONP之前,我們需要知道的是什么是JSON,有過一些web基礎(chǔ)的小伙伴一定都聽說過這個(gè)單詞了,JSON是如今用來傳輸文本的一種很流行的格式,其格式類似這樣:

{
  "id" : "1",
  "name" : "pino"
}

而JSONP的話,用一張圖片就比較形象的解釋了


就是這樣嘍,多出來了一個(gè)單詞和一對(duì)括號(hào)。那么JSONP用來做什么呢?通常來說,是用來跨域的,我們都知道,瀏覽器是存在一個(gè)叫做同源策略的東東,不同源的兩個(gè)站點(diǎn)理論上是無法進(jìn)行網(wǎng)絡(luò)通信的,但是有的時(shí)候我們還是需要進(jìn)行不同源的站點(diǎn)通信,那么就用到了JSONP來進(jìn)行跨域通信啦。

0x03 JSONP跨域通信的實(shí)現(xiàn)

JSONP的跨域?qū)崿F(xiàn)有很多種方式,這里我給大家展示的是兩種類型的方式,javascript和jquery,而jquery又有三種方法。

服務(wù)端

盡管有很多種方式,但是這里服務(wù)端的代碼是一成不變的,這里我在自己的公網(wǎng)服務(wù)器上創(chuàng)建了一個(gè)jsonp.php的文件

<?php
    $arr = array('id'=>1, 'name'=>'pino','location'=>'china');
    $result = json_encode($arr);

    $callback = $_GET['callback'];
    echo $callback."($result)";
?>

并且修改自己電腦中的hosts文件,把公網(wǎng)ip對(duì)應(yīng)一個(gè)域名,這里我起名為pino.my.com

3.1 前端——Javascript代碼

<!DOCTYPE html>
<html>
<head>
   <title>jsonp</title>
   <meta content="text/html; charset=urf-8" http-equiv="Content-Type">

<script type="text/javascript">
   function jsonpCallback(result){
       for(var i in result){
           document.write(i+":"+result[i]+"<br />");
       }
   }
</script>
<script src="http://pino.my.com/jsonp.php?callback=jsonpCallback"></script>
</head>
</html>

需要注意的是,function一定要定義在請(qǐng)求之前,否則會(huì)出現(xiàn)未定義的錯(cuò)誤

這里我們?cè)L問http://localhost:8080/jsonp.html,這個(gè)網(wǎng)頁(yè)中有一個(gè)跨域請(qǐng)求,請(qǐng)求pino.my.com的資源,通過callback的方式完成請(qǐng)求

script標(biāo)簽src訪問

成功獲取服務(wù)端資源!

前端——JQuery之getJSON方法

getJSON方法的用法如下:


實(shí)現(xiàn)代碼如下:

<!DOCTYPE html>
<html>
<head>
    <title>jsonp with jquery</title>
    <script src="https://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
    <script type="text/javascript">
        $(document).ready(function(){
            $.ajax({
                url:"http://pino.my.com/jsonp.php",
                dataType:"jsonp",
                data:"",
                jsonp:"callback",
                success:function(result){
                    for(var i in result){
                        document.write(i+":"+result[i]+"<br />");
                    }
                },
                timeout:3000
            });
        });
    </script>
</body>
</html>
getJSONP方法訪問

訪問后同樣成功獲取資源

前端——JQuery之a(chǎn)jax方法

代碼

<!DOCTYPE html>
<html>
<head>
    <title>jsonp with jquery ajax</title>
    <script src="https://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
    <script type="text/javascript">
        $(document).ready(function(){
            $.ajax({
                url:"http://pino.my.com/jsonp.php",
                dataType:"jsonp",
                data:"",
                jsonp:"callback",
                success:function(result){
                    for(var i in result){
                        document.write(i+":"+result[i]+"<br />");
                    }
                },
                timeout:3000
            });
        });
    </script>
</body>
</html>

這里的url是直接http://pino.my.com/jsonp.php,沒有?callback,這是應(yīng)為ajax方法的回調(diào)是直接放在success選項(xiàng)中了,因此需要在success選項(xiàng)中定義一個(gè)回調(diào)函數(shù)function

訪問一下:


ajax方法訪問

前端——JQuery之get方法

<!DOCTYPE html>
<html>
<head>
    <title>jsonp with jquery get</title>
    <script src="https://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script>
</head>
</head>
<body>
    <script type="text/javascript">
        $(document).ready(function(){
            $.get("http://pino.my.com/jsonp.php?callback=?",
                    function(result){
                        for(var i in result){
                            document.write(i+":"+result[i]+"<br />");
                        }
                    },
                    'jsonp'
                );
        });
    </script>
</body>
</html>
get方法訪問

get方法需要寫的東西跟getJSNON很像,但是一定別忘記最后還有一個(gè)jsonp的選項(xiàng),否則會(huì)出錯(cuò)的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 什么是同源策略 瀏覽器限制不同源的兩個(gè)網(wǎng)站間腳本和文本的相互訪問,只允許訪問同源下的內(nèi)容。所謂同源,就是指兩...
    熊蛋子17閱讀 754評(píng)論 1 6
  • Asynchronous JavaScript and XML (Ajax) 是驅(qū)動(dòng)新一代 Web 站點(diǎn)(流行術(shù)語...
    張玉帥閱讀 1,049評(píng)論 0 3
  • JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動(dòng)態(tài)腳本技術(shù)。在JavaScript中,有一個(gè)很重要的...
    西瓜w閱讀 1,914評(píng)論 0 1
  • 萬般癡狂一筆勾銷,此去無言謝你相忘,山水淺絳處許你放下。 ——霍尊《不送帖...
    蘇長(zhǎng)亭閱讀 2,229評(píng)論 19 41
  • “您的借記卡賬戶XXXX于3月1日收入人民幣1000.00元,交易后剩余余額XXXX【中國(guó)銀行】” 銀行卡里的錢又...
    食瓜閱讀 736評(píng)論 0 1

友情鏈接更多精彩內(nèi)容