jsonp為什么能夠?qū)崿F(xiàn)跨域?

為什么會存在跨域問題?

因為所有支持JavaScript的瀏覽器都有一個叫做“同源策略”的安全策略。
具體怎么個策略法不是本章所探討的。
這個安全策略就導致了不能跨域請求。

什么是跨域?

跨域大概就是你以一個‘http://localhost:3000’去請求了一個‘http://localhost:3001’的資源(反之亦然)。
我們的瀏覽器就會很友好地給我們提示:

image

此處用的是fetch

但是很多時候,我們特別需要跨域,所以市面上出現(xiàn)了聞名的jsonp用來解決跨域問題。

jsonp是如何實現(xiàn)跨域的?

jsonp的實現(xiàn)遵循了一個原理:

js文件是可以不受安全策略的限制而隨便下載的

所以,我們可以在html的頂部加上我們要請求的資源,例如:

<script type="text/javascript" src="http://localhost:3000/test.js></script>

通過查看瀏覽器的network,這個資源是請求到了,跨域也成功了!

jsonp就是通過這個原理來實現(xiàn)跨域的,當然不僅僅是這些。

簡易代碼實現(xiàn)jsonp跨域

眾所周知,jsonp的跨域,是要帶上callback函數(shù)的。

我們把本地實現(xiàn)的back函數(shù)傳遞過去 ?callback=back

<script>
    function back(data) {
        console.log(data);
    }
</script>
       
<script type="text/javascript" src="http://localhost:3000/test.js?callback=back"></script>
  

http://localhost:3000/test.js里,我們只需要執(zhí)行back函數(shù)即可:

back({message:"success"});

并且返回了json

{ 
    message:"success"
}

約定回調(diào)函數(shù)名很重要!約定回調(diào)函數(shù)名很重要!約定回調(diào)函數(shù)名很重要!


額外小細節(jié)

如果我在http://localhost:3000/test.js里,我不用我們約定的back回調(diào)函數(shù)名,那么我們的控制什么都不會打印,比如我此刻:

say({message:"success"});
image

沒有定義say所以控制臺報錯啦!

同理,如果你重復定義

const back = ({message:"success"});

也會報錯:

image

這都是語法問題啦!

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

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

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