JSONP_跨域

什么是同源策略?

同源是瀏覽器出于安全方面的考慮,只允許與本域下的接口交互秒拔。不同源的客戶(hù)端腳本在沒(méi)有明確授權(quán)的情況下,不能讀寫(xiě)對(duì)方的資源砂缩。

由Netscape提出的一個(gè)著名的安全策略∪洌現(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略

同源三大要素:,就是必須協(xié)議喳挑、域名滔悉、端口都一致的单绑,才叫做同源

  • 相同協(xié)議:如都是http或者h(yuǎn)ttps
  • 相同域名:是用來(lái)定位網(wǎng)站的獨(dú)一無(wú)二的名字http://jirengu.com/ahttp://jirengu.com/b或者www.baidu.comwww.baidu.cn
  • 相同端口:如都是80端口,或者8080端口

看一些同源例子:

http://jirengu.com/a/b.jshttp://jirengu.com/index.php (同源)

不同源的例子:

http://jirengu.com/main.jshttps://jirengu.com/a.php (協(xié)議不同)
http://jirengu.com/main.jshttp://bbs.jirengu.com/a.php(域名不同,域名必須完全相同才可以)
http://jiengu.com/main.jshttp://jirengu.com:8080/a.php (端口不同,第一個(gè)是80)

需要注意的是: 對(duì)于當(dāng)前頁(yè)面來(lái)說(shuō)頁(yè)面存放的 JS 文件的域不重要歉提,重要的是加載該 JS 頁(yè)面所在什么域

同源策略的目的是什么:

  1. 為了保證用戶(hù)信息的安全,防止惡意網(wǎng)站竊取數(shù)據(jù)
  2. Cookie 往往用來(lái)保存用戶(hù)的登錄狀態(tài)版扩,如果用戶(hù)沒(méi)有退出登錄,其他網(wǎng)站就可以冒充用戶(hù)礁芦,為所欲為悼尾。因?yàn)闉g覽器同時(shí)還規(guī)定,提交表單不受同源政策的限制未状。
  3. 所以同源策略非常重要,不然cookie可以共享司草,互聯(lián)網(wǎng)沒(méi)有安全可言泡仗。

限制范圍

  • 非同源:
  1. Cookie(window.domain)
  2. DOM無(wú)法獲取(iframe和window.open打開(kāi)的窗口)(window.domain)(window.postMessage)
  3. AJAX請(qǐng)求不能發(fā)送

如何規(guī)避這些限制呢??
規(guī)避限制一: cookie

  • cookie是服務(wù)器寫(xiě)入瀏覽器的一段信息吨岭,只有同源的可以共享,網(wǎng)站要求用戶(hù)登入自己的賬戶(hù),登入后辣辫,認(rèn)證接口就會(huì)下發(fā)給瀏覽器一個(gè)cookie,通過(guò)
document.domain
Set-Cookie: key=value; domain=.example.com; path=/

完成了cookie的植入急灭,通過(guò)這種策略就完成了網(wǎng)站的統(tǒng)一認(rèn)證登入谷遂,這個(gè)在cookie中就會(huì)有一個(gè)相對(duì)比較重要的cookie參數(shù)

規(guī)避限制二: iframe
如果兩個(gè)網(wǎng)頁(yè)不同源,就無(wú)法拿到對(duì)方的DOM畴嘶。

解決方法:
片段識(shí)別符(fragment identifier)

window.name

跨文檔通信API(Cross-document messaging)

限制規(guī)避三: Ajax

  1. JSONP是服務(wù)器與客戶(hù)端跨源通信的常用方法集晚。最大特點(diǎn)就是簡(jiǎn)單適用,老式瀏覽器全部支持偷拔,服務(wù)器改造非常小亏钩。
    它的基本思想是欺旧,網(wǎng)頁(yè)通過(guò)添加一個(gè)<script>元素,向服務(wù)器請(qǐng)求JSON數(shù)據(jù)栅哀,這種做法不受同源政策限制踏枣;服務(wù)器收到請(qǐng)求后,將數(shù)據(jù)放在一個(gè)指定名字的回調(diào)函數(shù)里傳回來(lái)茵瀑。
  2. WebSocket是一種通信協(xié)議,使用ws://(非加密)和wss://(加密)作為協(xié)議前綴马昨。該協(xié)議不實(shí)行同源政策,只要服務(wù)器支持屹篓,就可以通過(guò)它進(jìn)行跨源通信匙奴。
  3. CORS這個(gè)是現(xiàn)在用到比較廣的一種方式,全稱(chēng)是”跨域資源共享”泼菌。

后面重點(diǎn)講解ajax的不同源解決方案

什么是跨域?跨域有幾種實(shí)現(xiàn)形式

先了解一下什么是跨域

跨域就是允許不同域的接口進(jìn)行交互荒揣,說(shuō)白點(diǎn)就是post焊刹、get的url不是你當(dāng)前的網(wǎng)站,域名不同虐块。

  • 跨域的幾種方式:
    • JSONP
    • CORS
    • 降域
    • postMessage

JSONP 的原理是什么

  • 自動(dòng)跨域的前提是服務(wù)端愿意提供接口給你用,
  • 利用了javascript可以加載一個(gè)東西,不受同源策略的限制,相當(dāng)于可以加載任意的東西作為js來(lái)執(zhí)行,但需要后端來(lái)支持
  • 數(shù)據(jù)來(lái)了以后,我們自己寫(xiě)好了一個(gè)函數(shù)來(lái)操作這些數(shù)據(jù),最后在src后面加上最后加個(gè)參數(shù)callback=_fun(函數(shù)名)
專(zhuān)業(yè)總結(jié)就是
  • 定義數(shù)據(jù)處理函數(shù)_fun
  • 創(chuàng)建script標(biāo)簽,src的地址執(zhí)行后端接口举农,最后加個(gè)參數(shù)callback=_fun
  • 服務(wù)端在收到請(qǐng)求后敞嗡,解析參數(shù),計(jì)算返還數(shù)據(jù)喉悴,輸出 fun(data) 字符串。
  • fun(data)會(huì)放到script標(biāo)簽做為js執(zhí)行婚脱。此時(shí)會(huì)調(diào)用fun函數(shù)勺像,將data做為參數(shù)。
開(kāi)啟mock server主要是啟用router.js
作為js去執(zhí)行,有這個(gè)函數(shù)

不用https協(xié)議,只是file協(xié)議就可以點(diǎn)擊,實(shí)現(xiàn)跨域

JSONP

callback

CORS是什么

  • CORS 全稱(chēng)是跨域資源共享(Cross-Origin Resource Sharing),是一種 ajax 跨域請(qǐng)求資源的方式殃姓,支持現(xiàn)代瀏覽器,IE支持10以上蜗侈。 實(shí)現(xiàn)方式很簡(jiǎn)單,當(dāng)你使用 XMLHttpRequest 發(fā)送請(qǐng)求時(shí)枷颊,瀏覽器發(fā)現(xiàn)該請(qǐng)求不符合同源策略,會(huì)給該請(qǐng)求加一個(gè)請(qǐng)求頭:Origin夭苗,后臺(tái)進(jìn)行一系列處理吆倦,如果確定接受請(qǐng)求則在返回結(jié)果中加入一個(gè)響應(yīng)頭:Access-Control-Allow-Origin; 瀏覽器判斷該相應(yīng)頭中是否包含 Origin 的值,如果有則瀏覽器會(huì)處理響應(yīng)蚕泽,我們就可以拿到響應(yīng)數(shù)據(jù),如果不包含瀏覽器直接駁回须妻,這時(shí)我們無(wú)法拿到響應(yīng)數(shù)據(jù)。所以 CORS 的表象是讓你覺(jué)得它與同源的 ajax 請(qǐng)求沒(méi)啥區(qū)別敛惊,代碼完全一樣。
cors
  • 需要修改hosts文件

降域

降域其實(shí)是吧域名降一個(gè)等級(jí)

document.domain
降域

postMessage

  • postMessage的原理是會(huì)向另一個(gè)地方發(fā)送信息瞧挤,另一個(gè)地方通常是iframe,或者是由當(dāng)前頁(yè)面彈出的窗口。參數(shù)是:信息以及表示接受消息方的來(lái)自哪個(gè)域的字符串执俩,如果給定*便是不限定接受者的域。
    所以在一個(gè)html中嵌入另一個(gè)html文件的iframe役首,并且互相發(fā)送postMessage并響應(yīng)在input框以此來(lái)觀察效果显拜。
postMessage

參考
代碼地址
wikipedia-JSONP
wikipedia-CORS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市矮固,隨后出現(xiàn)的幾起案子矮台,更是在濱河造成了極大的恐慌,老刑警劉巖辰晕,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件确虱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡校辩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)惠赫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)故黑,“玉大人,你說(shuō)我怎么就攤上這事场晶。” “怎么了诗轻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搔体。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嫉柴,這世上最難降的妖魔是什么奉呛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任夯尽,我火速辦了婚禮,結(jié)果婚禮上匙握,老公的妹妹穿的比我還像新娘。我一直安慰自己秦忿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布灯谣。 她就那樣靜靜地躺著蛔琅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罗售。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天寨躁,我揣著相機(jī)與錄音穆碎,去河邊找鬼职恳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛话肖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贺氓,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔑水!你這毒婦竟也來(lái)了扬蕊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤歇父,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后再愈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體榜苫,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年翎冲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垂睬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抗悍,死狀恐怖驹饺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缴渊,我是刑警寧澤赏壹,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疟暖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俐巴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一擎鸠、第九天 我趴在偏房一處隱蔽的房頂上張望劣光。 院中可真熱鬧糟把,春花似錦、人聲如沸雄可。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箱残。三九已至止吁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赏殃,已是汗流浹背仁热。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工抗蠢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅矛,地道東北人潜叛。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓威兜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚂踊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笔宿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 什么是同源策略 同源政策(same-origin policy)是指同域名(或ip),同端口涝动,同協(xié)議視為同一個(gè)域炬灭,...
    小囧兔閱讀 511評(píng)論 0 1
  • 題目1: 什么是同源策略 瀏覽器出于安全方面的考慮,只允許與本域下的接口交互镰官。不同源的客戶(hù)端腳本在沒(méi)有明確授權(quán)的情...
    無(wú)目的閱讀 261評(píng)論 0 0
  • 什么是同源策略 同源策略/SOP(Same origin policy)是一種約定泳唠,由Netscape公司1995...
    YQY_苑閱讀 313評(píng)論 0 0
  • 1.什么是同源策略瀏覽器出于安全方面的考慮笨腥,只允許與本域下的接口交互勇垛。不同源的客戶(hù)端腳本在沒(méi)有明確授權(quán)的情況下闲孤,不...
    24_Magic閱讀 497評(píng)論 0 0
  • 題目1: 什么是同源策略 瀏覽器出于安全方面考慮,只允許與本域下的接口交互肥照。不同源的客戶(hù)端腳本在沒(méi)有明確授權(quán)的情況...
    Taaaaaaaurus閱讀 210評(píng)論 0 0