跨域解決方法

跨域

跨域指一個(gè)域下的文檔或者腳本,去請(qǐng)求另一個(gè)域下面的資源劫拗。一般應(yīng)用:

  1. 資源跳轉(zhuǎn): A鏈接床三、重定向、表單提交
  2. 資源嵌入: <link>杨幼、<script>撇簿、<img><frame>等dom標(biāo)簽差购,還有樣式中background:url()四瘫、@font-face()等文件外鏈
  3. 腳本請(qǐng)求: js發(fā)起的ajax請(qǐng)求、dom和js對(duì)象的跨域操作等

同源策略

瀏覽器出于安全方面的考慮欲逃,只允許與本域下的接口交互找蜜。不同源的客戶端腳本在沒有明確授權(quán)的情況下,不能讀寫對(duì)方的資源稳析。它是瀏覽器最核心也最基本的安全功能洗做,如果缺少了同源策略,瀏覽器很容易受到XSS彰居、CSFR等攻擊诚纸。所謂同源是指"協(xié)議+域名+端口"三者相同,即便兩個(gè)不同的域名指向同一個(gè)ip地址陈惰,也非同源畦徘。

同源策略限制的行為:

  1. Cookie、LocalStorage 和 IndexDB 無法讀取
  2. DOM 和 Js對(duì)象無法獲得
  3. AJAX 請(qǐng)求不能發(fā)送

一般跨域解決方案

1抬闯、 通過jsonp跨域
2井辆、 document.domain + iframe跨域(此方案僅限主域相同,子域不同的跨域應(yīng)用場(chǎng)景溶握。)
3杯缺、 location.hash + iframe (a欲與b跨域相互通信,通過中間頁c來實(shí)現(xiàn)睡榆。 三個(gè)頁面萍肆,不同域之間利用iframe的location.hash傳值袍榆,相同域之間直接js訪問來通信。)
4匾鸥、 window.name + iframe跨域(window.name屬性的獨(dú)特之處:name值在不同的頁面(甚至不同域名)加載后依舊存在蜡塌,并且可以支持非常長的 name 值(2MB)。)
5勿负、 postMessage跨域
6馏艾、 跨域資源共享(CORS)
7、 nginx代理跨域
8奴愉、 nodejs中間件代理跨域
9琅摩、 WebSocket協(xié)議跨域

jsonp跨域

在html頁面中再通過相應(yīng)的標(biāo)簽從不同域名下加載靜態(tài)資源。jsonp缺點(diǎn):只能實(shí)現(xiàn)get一種請(qǐng)求锭硼。

html+js 實(shí)現(xiàn):

<script>
function showData(ret){
console.log(ret);
}
</script>
<script src="http://api.com/weather.php?callback=showData"></script>

js 實(shí)現(xiàn):

    var script = document.createElement('script');
    script.type = 'text/javascript';

    // 傳參并指定回調(diào)執(zhí)行函數(shù)為showData
    script.src = 'http://api.com/weather.php?callback=showData';
    document.head.appendChild(script);

    // 回調(diào)執(zhí)行函數(shù)
    function showData(res) {
        console.log(JSON.stringify(res));
    }

postMessage跨域

postMessage是HTML5 XMLHttpRequest Level 2中的API房资,且是為數(shù)不多可以跨域操作的window屬性之一,它可用于解決以下方面的問題:

  • 頁面和其打開的新窗口的數(shù)據(jù)傳遞
  • 多窗口之間消息傳遞
  • 頁面與嵌套的iframe消息傳遞
  • 上面三個(gè)場(chǎng)景的跨域數(shù)據(jù)傳遞

a.html (http://www.domain1.com/a.html)

<iframe id="iframe" src="http://www.domain2.com/b.html" style="display:none;"></iframe>
<script>       
    var iframe = document.getElementById('iframe');
    iframe.onload = function() {
        var data = {
            name: 'aym'
        };
        // 向domain2傳送跨域數(shù)據(jù)
        iframe.contentWindow.postMessage(JSON.stringify(data), 'http://www.domain2.com');
    };

    // 接受domain2返回?cái)?shù)據(jù)
    window.addEventListener('message', function(e) {
        alert('data from domain2 ---> ' + e.data);
    }, false);
</script>

b.html(http://www.domain2.com/b.html)

<script>
    // 接收domain1的數(shù)據(jù)
    window.addEventListener('message', function(e) {
        alert('data from domain1 ---> ' + e.data);

        var data = JSON.parse(e.data);
        if (data) {
            data.number = 16;

            // 處理后再發(fā)回domain1
            window.parent.postMessage(JSON.stringify(data), 'http://www.domain1.com');
        }
    }, false);
</script>

CORS(跨域資源共享)

CORS 全稱是跨域資源共享(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í)我們無法拿到響應(yīng)數(shù)據(jù)股缸。

普通跨域請(qǐng)求:只服務(wù)端設(shè)置Access-Control-Allow-Origin即可,前端無須設(shè)置容为,若要帶cookie請(qǐng)求:前后端都需要設(shè)置乓序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坎背,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寄雀,老刑警劉巖得滤,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盒犹,居然都是意外死亡懂更,警方通過查閱死者的電腦和手機(jī)眨业,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沮协,“玉大人龄捡,你說我怎么就攤上這事】对荩” “怎么了聘殖?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長行瑞。 經(jīng)常有香客問我奸腺,道長,這世上最難降的妖魔是什么血久? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任突照,我火速辦了婚禮,結(jié)果婚禮上氧吐,老公的妹妹穿的比我還像新娘讹蘑。我一直安慰自己,他們只是感情好筑舅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布座慰。 她就那樣靜靜地躺著,像睡著了一般豁翎。 火紅的嫁衣襯著肌膚如雪角骤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天心剥,我揣著相機(jī)與錄音邦尊,去河邊找鬼。 笑死优烧,一個(gè)胖子當(dāng)著我的面吹牛蝉揍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畦娄,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼又沾,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了熙卡?” 一聲冷哼從身側(cè)響起杖刷,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驳癌,沒想到半個(gè)月后滑燃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颓鲜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年表窘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了典予。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乐严,死狀恐怖瘤袖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昂验,我是刑警寧澤捂敌,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站凛篙,受9級(jí)特大地震影響黍匾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呛梆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一锐涯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧填物,春花似錦纹腌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至击困,卻和暖如春涎劈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阅茶。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蛛枚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脸哀。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓蹦浦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撞蜂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盲镶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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

  • 什么是跨域? 2.) 資源嵌入:蝌诡、溉贿、、等dom標(biāo)簽浦旱,還有樣式中background:url()顽照、@font-fac...
    電影里的夢(mèng)i閱讀 2,372評(píng)論 0 5
  • 1. 什么是跨域? 跨域一詞從字面意思看闽寡,就是跨域名嘛代兵,但實(shí)際上跨域的范圍絕對(duì)不止那么狹隘。具體概念如下:只要協(xié)議...
    w_zhuan閱讀 515評(píng)論 0 0
  • 1. 什么是跨域爷狈? 跨域一詞從字面意思看植影,就是跨域名嘛,但實(shí)際上跨域的范圍絕對(duì)不止那么狹隘涎永。具體概念如下:只要協(xié)議...
    他在發(fā)呆閱讀 822評(píng)論 0 0
  • 社交性質(zhì)的APP中思币,應(yīng)該都有用戶。用戶信息展示地方的不同羡微,會(huì)產(chǎn)生很多的樣式谷饿。用戶包含很多的信息、功能妈倔。用戶需要展示...
    比爾王BillWang閱讀 303評(píng)論 0 0
  • CA證書認(rèn)證:http://blog.csdn.net/langeldep/article/details/548...
    ideawork閱讀 1,345評(píng)論 0 0