JSONP & 跨域

同源策略(Same origin Policy)
  • 解析
    瀏覽器出于安全考慮,只允許與同域下的接口進行資源交互。
    不同域的客戶端腳本在沒有明確授權的情況下雀久,不能讀寫對方的資源。
  • 限制
    不能通過ajax的方法去請求不同源中的文檔趁舀。
    瀏覽器中不同域的框架之間是不能進行js的交互操作的赖捌。
  • 同域
    協議如 http
    域名如 jirengu.com 矮烹;
    端口如 80越庇。
    三者都相同才是同域。

跨域

  • 解析
    使不同域下的接口也能夠進行資源交互的一種技術奉狈。
  • 實現方式
  • JSONP (JSON with padding)
    解析 一種使用JSON數據的方法
    原理 利用<script>標簽沒有跨域限制卤唉,可以引入其他域下JS的特點;
    過程
    1 定義數據處理函數_fun
    2 創(chuàng)建<script>仁期,src=后端接口桑驱,最后加個參數 callback=_fun
    3 服務端在收到請求后,返還 fun(data) 字符串蟀拷。
    4 fun(data)放在<script>做為js執(zhí)行碰纬。此時會調用fun函數,將data做為參數问芬。
    Tip
    1 只支持GET請求,不支持POST等其它類型的HTTP請求寿桨;
    只支持跨域的HTTP請求此衅,不支持跨域的兩個頁面之間進行JS調用强戴。
    2 不受同源策略影響;
    兼容性較好挡鞍。
    $('Btn').addEventListener('click', function(){
    var script = document.createElement('script');
    script.src = 'http://127.0.0.1/getNews?callback=done';
    document.head.appendChild(script);
    document.head.removeChild(script);
    })
    function done(data){
    }
    前端
    -------------------------------------------------------------
    后端
    var cb = req.query.callback;
    if(cb){
    res.send(cb + '('+ JSON.stringify(data) + ')');
    }else{
    res.send(data);
    }
  • CORS(Cross-origin resource sharing 跨域資源共享)
    解析 一種 ajax 跨域請求資源的方式
    原理 使用自定義的 HTTP 頭部骑歹,讓服務器與瀏覽器進行溝通。
    過程
    1 使用 XMLHttpRequest發(fā)送請求時墨微,瀏覽器會添加請求頭:Origin
    2 后臺確定接受請求道媚,在返回結果中添加響應頭:Access-Control-Allow-Origin
    3 由瀏覽器判斷響應頭中是否包含 Origin
    4 如果包含瀏覽器會處理響應,返回響應數據翘县;如果不包含瀏覽器直接駁回最域。
    Tip
    1 支持所有類型的 HTTP 請求。
    2 兼容性較差锈麸。
    $('.change').addEventListener('click', function(){
    var xhr = new XMLHttpRequest();
    xhr.open('get', 'http://b.jrg.com:8080/getNews', true);
    xhr.send();
    xhr.onreadystatechange = function(){
    if(xhr.readyState === 4 && xhr.status === 200){
    done( JSON.parse(xhr.responseText) )
    }
    }
    })
    前端
    -------------------------------------------------------------
    后端
    res.header("Access-Control-Allow-Origin", "http://a.jrg.com:8080");
    res.send(data);
  • 降域
    解析 主域相同的時候镀脂,把兩個子域設置成相同的父域
    過程 document.domain + iframe
    document.querySelector('.a input').addEventListener('input',function(){
    window.frames[0].document.querySelector('input').value = this.value;
    })
    document.domain = "jrg.com"
    A子域
    -------------------------------------------------------------
    B子域
    document.querySelector('.b input').addEventListener('input', function(){
    window.parent.document.querySelector('input').value = this.value;
    })
    document.domain = 'jrg.com';
  • window.postMessage()
    解析 HTML5 的一個新特性,用來向其他所有的window對象發(fā)送消息忘伞。
    原理 不同的框架之間可以獲取window對象薄翅。
    Tip
    必須等所有的腳本執(zhí)行完才發(fā)送MessageEvent,如果在函數執(zhí)行的過程中調用氓奈,就會讓后面的函數超時無法執(zhí)行翘魄。
    $('.a input').addEventListener('input', function(){
    window.frames[0].postMessage(this.value,'');
    })
    window.addEventListener('message',function(e) {
    $('.main input').value = e.data
    });
    A子域
    -------------------------------------------------------------
    B子域
    $('.b input').addEventListener('input', function(){
    window.parent.postMessage(this.value, '
    ');
    })
    window.addEventListener('message',function(e) {
    $('#input').value = e.data
    });

應用

demo-jsonp
demo-cros

Tip

如何建立兩個不同域的網頁用來測試?(寫給負基礎同學如我)

1 安裝自帶npm的node what?
1.1 下載 這個就行
1.2 安裝一路next
1.3 配置環(huán)境變量 how
1.4 打開 右鍵+shift => 此處打開命令行窗口 ok
1.5 測試 node -v/返回版本號 => nmp -v/返回版本號ok

2 安裝mock-server what?
npm install -g server-mock

3 修改hosts how
127. 0. 0.1 a.xxx.com

4 打開本地服務器
4.1 測試文件夾下舀奶,調出node窗口
4.2 mock start

5 打開瀏覽器
5.1 a.xxx.com:8080/test1.html在a域打開測試文件夾下test1
5.2 b.xxx.com:8080/test2.html在b域打開測試文件夾下test2

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末暑竟,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子伪节,更是在濱河造成了極大的恐慌光羞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怀大,死亡現場離奇詭異纱兑,居然都是意外死亡,警方通過查閱死者的電腦和手機化借,發(fā)現死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門潜慎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蓖康,你說我怎么就攤上這事铐炫。” “怎么了蒜焊?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵倒信,是天一觀的道長。 經常有香客問我泳梆,道長鳖悠,這世上最難降的妖魔是什么榜掌? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮乘综,結果婚禮上憎账,老公的妹妹穿的比我還像新娘。我一直安慰自己卡辰,他們只是感情好胞皱,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著九妈,像睡著了一般反砌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允蚣,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天于颖,我揣著相機與錄音,去河邊找鬼嚷兔。 笑死森渐,一個胖子當著我的面吹牛,可吹牛的內容都是我干的冒晰。 我是一名探鬼主播同衣,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壶运!你這毒婦竟也來了耐齐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒋情,失蹤者是張志新(化名)和其女友劉穎埠况,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體棵癣,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡辕翰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了狈谊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜命。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖河劝,靈堂內的尸體忽然破棺而出壁榕,到底是詐尸還是另有隱情,我是刑警寧澤赎瞎,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布牌里,位于F島的核電站,受9級特大地震影響务甥,放射性物質發(fā)生泄漏二庵。R本人自食惡果不足惜贪染,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一缓呛、第九天 我趴在偏房一處隱蔽的房頂上張望催享。 院中可真熱鬧,春花似錦哟绊、人聲如沸因妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攀涵。三九已至,卻和暖如春洽沟,著一層夾襖步出監(jiān)牢的瞬間以故,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工裆操, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怒详,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓踪区,卻偏偏與公主長得像昆烁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缎岗,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容

  • 題目1: 什么是同源策略 瀏覽器出于安全考慮静尼,只允許與本域下的接口交互。不同源的客戶端腳本在沒有明確授權的情況下传泊,...
    saintkl閱讀 236評論 0 0
  • 1.什么是同源策略 同源策略(Same origin Policy):瀏覽器出于安全方面的考慮鼠渺,只允許與本域下的接...
    hellowade閱讀 186評論 0 0
  • 題目1: 什么是同源策略 瀏覽器出于安全方面的考慮,只允許與本域下的接口交互眷细。不同源的客戶端腳本在沒有明確授權的情...
    GaoYangTongXue丶閱讀 280評論 0 0
  • 1需要注意的是: 對于當前頁面來說頁面存放的 JS 文件的域不重要拦盹,重要的是加載該 JS 頁面所在什么域 題目2:...
    李永州的FE閱讀 309評論 0 0
  • 1、什么是同源策略 瀏覽器出于安全考慮薪鹦,只能同本域進行接口交互掌敬。不同源的客戶端腳本在未經許可的情況下,不允許讀寫對...
    撫年華輕過閱讀 313評論 0 0