為什么會存在跨域問題内边?
因?yàn)樗兄С諮avaScript的瀏覽器都有一個(gè)叫做“同源策略”的安全策略榴都。
具體怎么個(gè)策略法不是本章所探討的。
這個(gè)安全策略就導(dǎo)致了不能跨域請求漠其。
什么是跨域嘴高?
跨域大概就是你以一個(gè)‘http://localhost:3000’去請求了一個(gè)‘http://localhost:3001’的資源(反之亦然)竿音。
我們的瀏覽器就會很友好地給我們提示:
此處用的是fetch
但是很多時(shí)候,我們特別需要跨域拴驮,所以市面上出現(xiàn)了聞名的jsonp用來解決跨域問題春瞬。
jsonp是如何實(shí)現(xiàn)跨域的?
jsonp的實(shí)現(xiàn)遵循了一個(gè)原理:
js文件是可以不受安全策略的限制而隨便下載的
所以套啤,我們可以在html的頂部加上我們要請求的資源宽气,例如:
<script type="text/javascript" src="http://localhost:3000/test.js></script>
通過查看瀏覽器的network,這個(gè)資源是請求到了潜沦,跨域也成功了萄涯!
jsonp就是通過這個(gè)原理來實(shí)現(xiàn)跨域的,當(dāng)然不僅僅是這些唆鸡。
簡易代碼實(shí)現(xiàn)jsonp跨域
眾所周知涝影,jsonp的跨域,是要帶上callback函數(shù)的喇闸。
我們把本地實(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ù)名很重要唆樊!
額外小細(xì)節(jié)
如果我在http://localhost:3000/test.js
里,我不用我們約定的back回調(diào)函數(shù)名刻蟹,那么我們的控制什么都不會打印逗旁,比如我此刻:
say({message:"success"});
沒有定義say所以控制臺報(bào)錯(cuò)啦!
同理舆瘪,如果你重復(fù)定義
const back = ({message:"success"});
也會報(bào)錯(cuò):
這都是語法問題啦片效!