跨域解決方案之jsonp

1.背景介紹

所有支持Javascript的瀏覽器都會(huì)使用同源策略這個(gè)安全策略升薯。導(dǎo)致我們無法直接訪問非同源的鏈接匿级,無法取得非同源的數(shù)據(jù)顿乒,但在項(xiàng)目中我們的數(shù)據(jù)經(jīng)常寫在另一個(gè)源中削樊,于是我們需要突破同源限制青团,取得其他源的數(shù)據(jù)何什,這就叫跨域组哩。

2.知識(shí)剖析

常見的跨域方法有:

  1. jsonp,利用了src屬性可以跨域的特性
  2. document.domain跨子域
  3. Access Control,服務(wù)器端發(fā)送Access-Control-Allow-Origin響應(yīng)頭,規(guī)定請(qǐng)求的域名的訪問權(quán)限
  4. nginx反向代理处渣,客戶端nginx攔截代碼中虛假的http請(qǐng)求伶贰,替換成正確的http

如何算不同的域?

  1. 不同域名
  2. 同一域名罐栈,不同端口
  3. 同一域名黍衙,不同協(xié)議
  4. 域名和域名對(duì)應(yīng)ip
  5. 主域相同,子域不同
  6. 同一域名荠诬,不同二級(jí)域名

3.常見問題

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

4.解決方案

有兩個(gè)文件處于不同域中:

A.html
<script type="text/javascript">
   //回調(diào)函數(shù)
   function callback(data) {
       alert(data.message);
   }
</script>
<script type = "text/javascript" src ="http://localhost:20002/B.js"></script>
B.js
//調(diào)用callback函數(shù)琅翻,并以json數(shù)據(jù)形式作為闡述傳遞,完成回調(diào)
callback({message: "success"});

結(jié)果會(huì)alert“success”柑贞,這就是jsop的基本原理

5.編碼實(shí)戰(zhàn)

客戶端:

<script>
   //顯示后臺(tái)返回?cái)?shù)據(jù)的一個(gè)屬性
   function jsonp(data) {
       //alert傳入的data數(shù)組項(xiàng)中的一個(gè)屬性
       alert(JSON.parse(data)[0].location);
   }

   //添加<script>標(biāo)簽的方法
   function addScriptTag(src) {
       var script = document.createElement('script');
       script.setAttribute("type", "text/javascript");
       script.src = src;
       document.body.appendChild(script);
   }

   //防止script標(biāo)簽放在頭部運(yùn)行時(shí)方椎,body還未渲染
   window.onload = function () {
       //將數(shù)據(jù)從url中提取出來,便于添加數(shù)據(jù)钧嘶。
       var name = "馮強(qiáng)", age = 24, callback = "jsonp";
       addScriptTag("http://59.110.174.154/test/test1.js?name=" + name + "&age=" + age + "&callback=" + callback);
   }

</script>

服務(wù)器端:

//定義一些變量
var name,age,callback,data=[];
//遍歷script標(biāo)簽
[].forEach.call(document.scripts, function (val, index, arr) {
   if (val.src) {
       //使用正則表達(dá)式匹配url字符串棠众,并在回調(diào)函數(shù)中將我們需要的參數(shù)傳遞給變量
       decodeURI(val.src).replace(/.*\?name=(.*)&age=(.*)&callback=(.*)/g, function (match, p1, p2,p3,offset,string) {
           name=p1;
           age=p2;
           callback=p3;
       });
   }
});

//數(shù)據(jù)庫的一段JSON代碼
var json=[
   {"name":"小宇","age":"24","location":"襄陽"},
{"name":"恒光","age":"24","location":"益陽"},
{"name":"馮強(qiáng)","age":"24","location":"黃岡"}
]

//遍歷json,查詢符合參數(shù)的項(xiàng),屏添加到data數(shù)組中
json.forEach(function(val,index,arr){
   if(val.name===name&&val.age===age){
       data.push(json[index]);
   }
})

//JSON化data數(shù)組
data=JSON.stringify(data);

//使用eval解析callback函數(shù)名闸拿,并傳入data參數(shù)空盼,執(zhí)行函數(shù)
eval(callback)(data);

6.擴(kuò)展思考

jsonp跨域有什么優(yōu)缺點(diǎn)?

優(yōu)點(diǎn):兼容性很好好新荤,可以在古老的瀏覽器中運(yùn)行揽趾,
缺點(diǎn):它只支持GET請(qǐng)求而不支持POST等其它類型的HTTP請(qǐng)求。

jsonp和ajax有什么關(guān)系迟隅?

ajax是通過操作XMLHttpRequest對(duì)象發(fā)送請(qǐng)求但骨,獲取返回的數(shù)據(jù)。JSONP的全稱為JSON
with Padding智袭,Padding指的就是包裹在JSON外層的回調(diào)函數(shù)奔缠。從剛才的例子中,咱們發(fā)現(xiàn)JSONP并沒有操作XMLHttpRequest吼野,因此jsonp和ajax沒有任何關(guān)系校哎。

如何用jQuery實(shí)現(xiàn)JSONP

前端代碼:
$.ajax({
   url: "http://tonghuashuo.github.io/test/jsonp.txt",
dataType: 'jsonp',
jsonp: "callback",
jsonpCallback: "dosomething"
})
   .done(function (res) {
       console.log("success");
       console.log(res);
   })
   .fail(function (res) {
       console.log("error");
       console.log(res);
   });
這里使用了ajax這個(gè)方法,但實(shí)際上jsonp和ajax沒有任何關(guān)系瞳步,只是因?yàn)閖sonp請(qǐng)求和ajax請(qǐng)求相似闷哆,jquery在這里有誤導(dǎo)之嫌。

7.參考文獻(xiàn)

參考一:跨域資源共享CORS詳解
參考二:5分鐘徹底明白JSONP
參考三:深入淺出JSONP--解決ajax跨域問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末单起,一起剝皮案震驚了整個(gè)濱河市抱怔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘀倒,老刑警劉巖屈留,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異测蘑,居然都是意外死亡灌危,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門碳胳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勇蝙,“玉大人,你說我怎么就攤上這事挨约∥痘欤” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵诫惭,是天一觀的道長(zhǎng)翁锡。 經(jīng)常有香客問我,道長(zhǎng)贝攒,這世上最難降的妖魔是什么盗誊? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上哈踱,老公的妹妹穿的比我還像新娘荒适。我一直安慰自己,他們只是感情好开镣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布刀诬。 她就那樣靜靜地躺著,像睡著了一般邪财。 火紅的嫁衣襯著肌膚如雪陕壹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天树埠,我揣著相機(jī)與錄音糠馆,去河邊找鬼。 笑死怎憋,一個(gè)胖子當(dāng)著我的面吹牛又碌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绊袋,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼毕匀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了癌别?” 一聲冷哼從身側(cè)響起皂岔,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎展姐,沒想到半個(gè)月后躁垛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诞仓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年缤苫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了速兔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墅拭。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涣狗,靈堂內(nèi)的尸體忽然破棺而出谍婉,到底是詐尸還是另有隱情,我是刑警寧澤镀钓,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布穗熬,位于F島的核電站,受9級(jí)特大地震影響丁溅,放射性物質(zhì)發(fā)生泄漏唤蔗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妓柜。 院中可真熱鬧箱季,春花似錦、人聲如沸棍掐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽作煌。三九已至掘殴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粟誓,已是汗流浹背奏寨。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹰服,地道東北人服爷。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像获诈,于是被迫代替她去往敵國和親仍源。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 前言:對(duì)于跨域請(qǐng)求舔涎,很早之前就有去了解過笼踩,但因?yàn)橐恢标P(guān)注的都是服務(wù)器后端開發(fā),故也就僅僅停留在概念的理解上而沒有機(jī)...
    ken_ljq閱讀 89,723評(píng)論 6 128
  • JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動(dòng)態(tài)腳本技術(shù)亡嫌。在JavaScript中嚎于,有一個(gè)很重要的...
    西瓜w閱讀 1,748評(píng)論 0 1
  • 協(xié)方差的定義 在統(tǒng)計(jì)學(xué)上,協(xié)方差用來刻畫兩個(gè)隨機(jī)變量之間的相關(guān)性挟冠,反映的是變量之間的二階統(tǒng)計(jì)特性于购,兩個(gè)隨機(jī)變量Xi...
    marine0131閱讀 4,140評(píng)論 0 0
  • 從沒有這一刻 這樣熱愛這個(gè)家族 一詞Ca 幻滅了所有僥幸 無語凝噎 淚千行 想多看一眼 想多說一句 想不顧一切趕回...
    wang1110閱讀 79評(píng)論 0 0
  • 關(guān)于比賽,每個(gè)人的看法都不一樣知染。其實(shí)肋僧,我認(rèn)為從中獲取的能量遠(yuǎn)比證書更有分量,因?yàn)槲疑钣畜w會(huì)控淡。 我...
    歡樂顏晴閱讀 704評(píng)論 0 1