摘要:由于第二種方法如今已經(jīng)采用的非常少,所以我們在這兒不做講解一帶填充的是一種可以在中繞過同源策略,并發(fā)起跨域請求的使用模式,可以啟動的跨域請求同源策略有一個顯著的例外,腳本元素是可以規(guī)避檢查的。
講跨域之前,我們先來講同源策略(SOP),同源策略是網(wǎng)景公司提出的一個著名安全策略。所謂同源就是域名、協(xié)議、端口相同。例如http://www.12306.cn中,http就是超文本傳輸協(xié)議,12306就是域名,cn就是端口。如果兩個資源需要通信,那么他必須滿足SOP。而在前端中我們使用ajax進(jìn)行數(shù)據(jù)請求。
如果資源不同域,那么我們在使用ajax請求數(shù)據(jù)的時候,就會報錯,表示拒絕訪問。那如何進(jìn)行跨域處理呢?事實上有三種方法1、JSONP,2、子域代理,3、CORS。由于第二種方法如今已經(jīng)采用的非常少,所以我們在這兒不做講解
帶填充的JSON,是一種可以在JS中繞過同源策略,并發(fā)起跨域HTTP請求的使用模式,可以啟動JS的跨域HTTP請求
同源策略有一個顯著的例外,HTML腳本元素是可以規(guī)避SOP檢查的。那就意味著我們可以采用動態(tài)注入腳本的方式向其他源發(fā)出HTTP請求。JSONP正是利用了這個例外情況進(jìn)行跨域數(shù)據(jù)加載的。
我們先來看一個例子:使用ajax請求一個普通的JSON文件。假設(shè)你使用ajax請求"http://jsonpjs.com/info.json",它會返回一個JSON文檔,其中包含一些信息
{ "title": "jsonp explaintation", "author": "Cornelius" }
瀏覽器接受到這個json文件后,就會把他當(dāng)成字符串進(jìn)行處理,但是這個字符串我們需要把它轉(zhuǎn)換為對象,才能夠被javascript所使用,這里我們就可以使用json.parse函數(shù)來完成。當(dāng)然由于同源策略的限制,ajax只能夠在同一個域中才能夠使用。但是正如我們前面提到的,script是html腳本元素它可以規(guī)避SOP的檢查所以我們?yōu)榱苏埱蟮絡(luò)son文件,我們可以使用這種方式
通過script元素請求資源,當(dāng)文件加載完成時,瀏覽器會把json響應(yīng)當(dāng)作Javascript解析。但是這樣的情況下我們還是無法獲得json數(shù)據(jù)。
由于該對象沒有被存儲,也沒有賦值給一個變量,或者作為參數(shù)傳遞給一個函數(shù),瀏覽器就會忽略它。
那么該如何獲取JSON輸出呢?
這兒有兩種方法,第一種直接由服務(wù)器把json數(shù)據(jù)進(jìn)行存儲。例如有一個外部URL,http://jsonjs.com//info.js(注意文件擴展名是.js而不是.json),內(nèi)容如下
var jsonResponse = { "title": "jsonp explaintation", "author": "Cornelius" }
當(dāng)文件加載完成后,我們就可以通過全局變量jsonResponse訪問這個JSON對象了。當(dāng)該變量包含所請求數(shù)據(jù)時,我們可以使用script.onload來通知代碼。那么另外一種通過一個回調(diào)函數(shù)代替全局變量的方式來傳遞JSON對象
jsonHandler({ "title": "jsonp explaintation", "author": "Cornelius" })
使用這種方式的好處在于,我們不需要依靠script元素的onload事件來判斷json是否可用,當(dāng)info.js被解析時,回調(diào)便會自動執(zhí)行。這需要加載
我的github如果對你有幫助請點一個star
第一次寫技術(shù)文章,不足的地方還請各位多多指教
參考文獻(xiàn):跨域資源共享 CORS 詳解 ---阮一峰
[third-party javascript ---- Ben Vinegar Anton Kovalyov][2]
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91752.html
摘要:類似這樣而在客戶端我們只需要定義一個預(yù)定好的回調(diào)函數(shù)即可。處理跨域請求得到的數(shù)據(jù)其中的是我們在客戶端定義好的在數(shù)據(jù)請求成功后要執(zhí)行的回調(diào)函數(shù)。 跨域產(chǎn)生的原因 跨域是由瀏覽器的同源策略引起的,即不同源(協(xié)議,域名,端口中其中有一個不同)的js是不能讀取對方的資源的。當(dāng)要網(wǎng)站中的js要請求其他網(wǎng)站的數(shù)據(jù)時就會產(chǎn)生跨域問題,就像下面這樣,瀏覽器會報錯。 showImg(https://se...
摘要:例外當(dāng)涉及到同源策略時,有兩個主要的例外授信范圍兩個相互之間高度互信的域名,如公司域名,不遵守同源策略的限制。端口未將端口號加入到同源策略的組成部分之中,因此和屬于同源并且不受任何限制。 原文鏈接:http://www.devsai.com/2016/11/24/talk-CORS/ 同源策略(same origin policy) 1995年,同源政策由 Netscape 公司引入瀏...
閱讀 3091·2021-10-12 10:20
閱讀 2824·2021-09-27 13:56
閱讀 799·2021-09-27 13:36
閱讀 1439·2021-09-26 09:46
閱讀 2425·2019-08-30 14:02
閱讀 2693·2019-08-28 18:14
閱讀 1270·2019-08-26 10:32
閱讀 1712·2019-08-23 18:25