最新 ajax 跨域原理及解決方式詳解

前言


前幾天调鲸,有個(gè)朋友問(wèn)我跨域的問(wèn)題,尋思著找篇文章給他理解挽荡。找了半天都沒(méi)有直中要害藐石,個(gè)人認(rèn)為都是理解的模棱兩可,所以花時(shí)間把自己的對(duì)ajax跨域的理解寫下來(lái)定拟。

什么是跨域于微?


假設(shè)我訪問(wèn)a 站點(diǎn)逗嫡,在a站點(diǎn)得到一個(gè)頁(yè)面,在a 站點(diǎn)的這個(gè)頁(yè)面想去訪問(wèn)b 站點(diǎn)的資源株依,這個(gè)是就會(huì)產(chǎn)生一個(gè)跨域的效果驱证。由于瀏覽器是有安全限制的,所以a 站點(diǎn)無(wú)法訪問(wèn)到b站點(diǎn)的資源恋腕。

比如我現(xiàn)在訪問(wèn) www.1.com 獲取到一個(gè)頁(yè)面.通過(guò)這個(gè)頁(yè)面去訪問(wèn)www.2.com獲取資源抹锄。就會(huì)產(chǎn)生跨域。

問(wèn)題展現(xiàn)

接口我用的是聚合數(shù)據(jù)荠藤,有接口調(diào)用次數(shù)限制伙单,如若接口調(diào)用有問(wèn)題,請(qǐng)自行申請(qǐng)接口哈肖。

1吻育、創(chuàng)建一個(gè)ajaxDemo_1.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>ajax</title>
</head>

<body>
    這是一個(gè)有跨域問(wèn)題的頁(yè)面
    <script src="./jquery.min.js"></script>
    <script type="text/javascript">
        $.ajax({
            type: "get",
            cache: false,
            url: 'http://apis.juhe.cn/oil/region?key=1b9411b68adda384780872fabcafc16d&city=%e5%8c%97%e4%ba%ac',
            dataType: "json",
            success: function(result) {
                console.log(JSON.stringify(result));
            },
            error: function(err) {
                console.log('err10: ');
                console.log(err);
            }
        });
    </script>
</body>

</html>
2、將ajaxDemo_1.html放到本地node.js服務(wù)器上運(yùn)行
由于跨域問(wèn)題產(chǎn)生的錯(cuò)誤

ajax底層請(qǐng)求類型為XMLHttpRequest

如何解決淤井?


1布疼、jsonp(只能解決get請(qǐng)求跨域問(wèn)題)

創(chuàng)建一個(gè)ajaxDemo_2.html 發(fā)起get請(qǐng)求
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajaxDemo_2</title>
</head>
<body>
這是一個(gè)用jsonp解決get請(qǐng)求跨域問(wèn)題的頁(yè)面
<script src="./jquery.min.js"></script>
<script type="text/javascript">
    $.ajax({
        type: "get",
        cache: false,
        url: 'http://apis.juhe.cn/oil/region?key=1b9411b68adda384780872fabcafc16d&city=%e8%a1%a1%e9%98%b3',
        dataType: "jsonp",
        success: function(result) {
            console.log(JSON.stringify(result));
        },
        error: function(err) {
            console.log('err10: ');
            console.log(err);
        }
    });
</script>
</body>
</html>
運(yùn)行后沒(méi)有跨域問(wèn)題,可以正常請(qǐng)求到數(shù)據(jù)
ajax底層請(qǐng)求類型為script
ajax使用script元素發(fā)送jsonp請(qǐng)求

使用<script>元素進(jìn)行ajax傳輸?shù)脑颍?br>   1币狠、它不受同源策略的影響游两,因此可以使用它們從其他服務(wù)器請(qǐng)求數(shù)據(jù)。
  2总寻、包含JSON編碼數(shù)據(jù)的響應(yīng)體會(huì)自動(dòng)解碼(即執(zhí)行)器罐。

結(jié)論:當(dāng)通過(guò)<script>元素調(diào)用數(shù)據(jù)時(shí)梢为,響應(yīng)內(nèi)容必須用js函數(shù)名和圓括號(hào)包裹起來(lái)渐行,而不是發(fā)送一段json數(shù)據(jù)。而且通過(guò)<script>元素只能加載get請(qǐng)求而不能加載post請(qǐng)求

2铸董、cors(跨域資源共享 Cross-Origin Resource Sharing)

通過(guò)cors使跨域問(wèn)題在get請(qǐng)求和post請(qǐng)求都可以解決

2.1祟印、cors原理

CORS定義一種跨域訪問(wèn)的機(jī)制,可以讓AJAX實(shí)現(xiàn)跨域訪問(wèn)粟害。CORS 允許一個(gè)域上的網(wǎng)絡(luò)應(yīng)用向另一個(gè)域提交跨域 AJAX 請(qǐng)求蕴忆。實(shí)現(xiàn)此功能非常簡(jiǎn)單,只需由服務(wù)器發(fā)送一個(gè)響應(yīng)標(biāo)頭即可

2.2CORS瀏覽器支持情況
CORS瀏覽器支持情況圖解

CORS瀏覽器支持情況描述

  喜聞樂(lè)見悲幅、普大喜奔的支持情況套鹅,尤其是在移動(dòng)終端上,除了opera Mini汰具;
  PC上的現(xiàn)代瀏覽器都能友好的支持卓鹿,除了IE9-,不過(guò)前端工程師對(duì)這種情況早應(yīng)該習(xí)慣了...

2.3 應(yīng)用

假設(shè)我們頁(yè)面或者應(yīng)用已在 http://www.test1.com 上了留荔,而我們打算從 http://www.test2.com 請(qǐng)求提取數(shù)據(jù)吟孙。一般情況下,如果我們直接使用 AJAX 來(lái)請(qǐng)求將會(huì)失敗,瀏覽器也會(huì)返回“源不匹配”的錯(cuò)誤杰妓,"跨域"也就以此由來(lái)藻治。
  利用 CORS,http://www.test2.com 只需添加一個(gè)標(biāo)頭巷挥,就可以允許來(lái)自 http://www.test1.com 的請(qǐng)求桩卵,下圖是我在服務(wù)器返回中的 header() 設(shè)置,“*”號(hào)表示允許任何域向我們的服務(wù)端提交請(qǐng)求:


  也可以設(shè)置指定的域名倍宾,如域名 http://www.test2.com 吸占,那么就允許來(lái)自這個(gè)域名的請(qǐng)求:

  當(dāng)前我設(shè)置的header為“*”,任意一個(gè)請(qǐng)求過(guò)來(lái)之后服務(wù)端我們都可以進(jìn)行處理&響應(yīng)凿宾,那么在調(diào)試工具中可以看到其頭信息設(shè)置矾屯,其中見紅框中有一項(xiàng)信息是“Access-Control-Allow-Origin:* ”,表示我們已經(jīng)啟用CORS初厚。

cors示例

示例代碼

https://github.com/yangxiaopingios/AjaxDemo

參考資料

http://www.ruanyifeng.com/blog/2016/04/cors.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末件蚕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子产禾,更是在濱河造成了極大的恐慌排作,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亚情,死亡現(xiàn)場(chǎng)離奇詭異妄痪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)楞件,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門衫生,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人土浸,你說(shuō)我怎么就攤上這事罪针。” “怎么了黄伊?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵泪酱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我还最,道長(zhǎng)墓阀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任拓轻,我火速辦了婚禮斯撮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悦即。我一直安慰自己吮成,他們只是感情好橱乱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粱甫,像睡著了一般泳叠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茶宵,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天危纫,我揣著相機(jī)與錄音,去河邊找鬼乌庶。 笑死种蝶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞒大。 我是一名探鬼主播螃征,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼透敌!你這毒婦竟也來(lái)了盯滚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酗电,失蹤者是張志新(化名)和其女友劉穎魄藕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撵术,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡背率,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫩与。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寝姿。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蕴纳,靈堂內(nèi)的尸體忽然破棺而出会油,到底是詐尸還是另有隱情个粱,我是刑警寧澤古毛,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站都许,受9級(jí)特大地震影響稻薇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胶征,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一塞椎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睛低,春花似錦案狠、人聲如沸服傍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吹零。三九已至,卻和暖如春拉庵,著一層夾襖步出監(jiān)牢的瞬間灿椅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工钞支, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茫蛹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓烁挟,卻偏偏與公主長(zhǎng)得像婴洼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撼嗓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ajax作為前端開發(fā)必需的基礎(chǔ)能力之一窃蹋,你可能會(huì)使用它,但并不一定懂得其原理静稻,以及更深入的服務(wù)器通信相關(guān)的知識(shí)警没。在...
    蕭玄辭閱讀 822評(píng)論 0 0
  • 在項(xiàng)目開發(fā)過(guò)程中,遇到了Ajax跨域訪問(wèn)資源的問(wèn)題振湾,提示出現(xiàn)了類似于下面這樣的錯(cuò)誤: Cross-Origin R...
    vito1994閱讀 3,777評(píng)論 5 14
  • 在學(xué)校領(lǐng)導(dǎo)的大力鼓勵(lì)與支持下杀迹,上周五下午后兩節(jié)課,我們幾個(gè)志趣相投的同事匯聚101辦公室押搪,圍繞“語(yǔ)文課例研究”和“...
    小拓拓閱讀 392評(píng)論 2 1
  • 流是一組有順序的树酪,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對(duì)數(shù)據(jù)傳輸?shù)目偡Q或抽象大州。即數(shù)據(jù)在兩設(shè)備間的傳輸稱為流续语,流的本質(zhì)是數(shù)據(jù)傳...
    安安靜靜寫代碼閱讀 172評(píng)論 0 0
  • 姓名 徐海燕 公司 寧波四維爾工業(yè)有限責(zé)任公司 【日精進(jìn)打卡第245天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》大綱今日10遍...
    檸檬茶_4592閱讀 144評(píng)論 0 0