給新手朋友解釋前端解決跨域問題的方法

大家在初學(xué)的時候經(jīng)常遇到下圖這樣的報錯:

跨域錯誤.png

上圖是什么錯誤呢榜掌?

原來是因為瀏覽器有某些安全級別的限制,同源策略讲坎,所以在進(jìn)行瀏覽器端的web應(yīng)用開發(fā)的時候关筒,經(jīng)常會遇到跨域問題。

同源策略:

只有在同源的情況下(同域名驶睦,同協(xié)議砰左,同端口)才能進(jìn)行數(shù)據(jù)交互。

常用的跨域方式:

jsonp场航,cors缠导,服務(wù)端代理。

jsonp

是一種前后端結(jié)合的跨域問題解決方式:

原理:
動態(tài)的創(chuàng)建script標(biāo)簽溉痢,將script標(biāo)簽的src屬性設(shè)置成請求的目標(biāo)地址僻造,和后端商議之后,設(shè)置callback回調(diào)函數(shù)孩饼,利用回調(diào)函數(shù)來接收數(shù)據(jù)并進(jìn)行使用髓削。

為什么使用script:

依靠html中標(biāo)簽的src屬性不受同源策略的影響來實現(xiàn)的,而script標(biāo)簽接收到數(shù)據(jù)之后可以進(jìn)行數(shù)據(jù)的處理,所以一般選用script標(biāo)簽镀娶,

為什么要動態(tài)的創(chuàng)建script標(biāo)簽:

script只能執(zhí)行一次或者說只能請求一次立膛,所以說當(dāng)我們要不斷的進(jìn)行jsonp請求的時候,每一次的請求都需要一個script標(biāo)簽梯码,所以需要動態(tài)去創(chuàng)建script標(biāo)簽,script標(biāo)簽?zāi)軐⒄埱蟮降淖址當(dāng)?shù)據(jù)當(dāng)成js代碼去運行宝泵,所以我們可以依靠后端返回一段(執(zhí)行某個函數(shù),且給此函數(shù)傳入數(shù)據(jù))的這樣一段字符串來實現(xiàn)忍些,這樣的話鲁猩,script請求到該字符串之后,就會執(zhí)行該函數(shù)罢坝,且該函數(shù)能接收到數(shù)據(jù)廓握。

為什么需要和后端商議之后才能設(shè)置callback函數(shù):

因為后端開發(fā)者并不知道前端準(zhǔn)備來接收數(shù)據(jù)的函數(shù)是哪個函數(shù),所以需要讓前端通知后端接收數(shù)據(jù)的函數(shù)名,前端需要將函數(shù)名傳遞給后端嘁酿,但是傳遞的時候是以鍵值對的方式傳遞過去的隙券,所以需要前端將鍵值對的鍵名事先告知后端

注意:
獲取數(shù)據(jù)且操作完成后,一定要將創(chuàng)建的script標(biāo)簽去掉闹司,將隨機(jī)函數(shù)的內(nèi)存給釋放

缺點:
只能做get請求

    //封裝jsonp
   function Jsonp(options) {
        //獲取對象的url屬性
        let url = options.url
        //判斷有沒有url
        if(!url){console.error('url不合法');return ;};
                let success = options.success || function(){}
                //創(chuàng)建新函數(shù)準(zhǔn)備接收數(shù)據(jù)
                 var fname = 'jsonp'+Date.now()
                //掛載全局函數(shù)
                window[fname] = function(result){
                           //執(zhí)行成功回調(diào)并傳入回調(diào)函數(shù)
                            success(result)
                            //移除script標(biāo)簽
                            script.remove()
                            //移除全局函數(shù)
                            delete window[fname]
        }
         //動態(tài)創(chuàng)建script標(biāo)簽
        url+='?cb='+fname
        var script = $('<script>')      
        script.prop("src",url).appendTo($("body"))
    }

    Jsonp({
        url:'http://localhost:3000/text',
        success:function (results) {
            console.log(results)
        }        
    })

我希望用自問自答的形式能幫助大家更好的理解jsonp娱仔,其實官方?jīng)]有給出前端跨域的解決方法,但是我們偉大的程序猿自己摸索出來的解決跨域的一種方法jsonp游桩;是不是很厲害牲迫?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耐朴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盹憎,更是在濱河造成了極大的恐慌筛峭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陪每,死亡現(xiàn)場離奇詭異影晓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)檩禾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門挂签,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盼产,你說我怎么就攤上這事饵婆。” “怎么了辆飘?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵啦辐,是天一觀的道長。 經(jīng)常有香客問我蜈项,道長芹关,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任紧卒,我火速辦了婚禮侥衬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跑芳。我一直安慰自己轴总,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布博个。 她就那樣靜靜地躺著怀樟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盆佣。 梳的紋絲不亂的頭發(fā)上往堡,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音共耍,去河邊找鬼虑灰。 笑死,一個胖子當(dāng)著我的面吹牛痹兜,可吹牛的內(nèi)容都是我干的穆咐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼对湃!你這毒婦竟也來了崖叫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熟尉,失蹤者是張志新(化名)和其女友劉穎归露,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斤儿,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年恐锦,在試婚紗的時候發(fā)現(xiàn)自己被綠了往果。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡一铅,死狀恐怖陕贮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潘飘,我是刑警寧澤肮之,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站卜录,受9級特大地震影響戈擒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艰毒,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一筐高、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丑瞧,春花似錦柑土、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至西乖,卻和暖如春狐榔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浴栽。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工荒叼, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人典鸡。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓被廓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親萝玷。 傳聞我的和親對象是個殘疾皇子嫁乘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • 作者:Qyouu鏈接:https://www.imooc.com/article/70123來源:慕課網(wǎng) 本文對原...
    六個周閱讀 1,305評論 0 14
  • 1. 什么是跨域昆婿? 跨域一詞從字面意思看,就是跨域名嘛蜓斧,但實際上跨域的范圍絕對不止那么狹隘仓蛆。具體概念如下:只要協(xié)議...
    他在發(fā)呆閱讀 822評論 0 0
  • 頁面數(shù)據(jù)交互的發(fā)展過程 付款是我們?nèi)粘V谐R姷囊环N金錢交易,用戶在頁面中點擊付款按鈕挎春,網(wǎng)頁提交請求給服務(wù)器看疙,服務(wù)器...
    鷓鴣少閱讀 915評論 0 0
  • 01 是現(xiàn)在的時間太寶貴了?還是現(xiàn)在的人太聰明了直奋? 為什么見面問的第一句話就是“你有沒有男朋友”能庆,聊了一次天就約你...
    tonight北方有佳人閱讀 846評論 3 6
  • 在很久很久以前,有一只叫齊齊的小狗脚线,每天過著沒有人陪伴的生活:一個人吃飯搁胆,一個人玩,一個人睡覺邮绿,一個人自...
    林林林_d046閱讀 873評論 2 8