摘要:是的,方法被調(diào)用時,會在所有頁面腳本執(zhí)行完畢之后向目標(biāo)窗口派發(fā)一個消息。該消息有四個屬性需要注意屬性表示該的類型屬性為的第一個參數(shù)屬性表示調(diào)用方法時調(diào)用頁面的當(dāng)前狀態(tài)屬性記錄調(diào)用方法的窗口信息。
1.為什么要跨域
同源策略限制一個源加載的文檔或文檔與來自另一個源的資源進(jìn)行交互。這是一個用于隔離潛在惡意文件的安全機(jī)制。
什么是同源呢? 如果協(xié)議,端口(如果指定了一個)和域名對于兩個頁面是相同的,則兩個頁面具有相同的源。
下表給出了相對http://store.company.com/dir/...同源檢測的示例:
跨域網(wǎng)絡(luò)訪問通常分為3種
通常允許進(jìn)行跨域?qū)懖僮鳎–ross-origin writes)。例如鏈接(links),重定向以及表單提交。特定少數(shù)的HTTP請求需要添加 preflight。
通常允許跨域資源嵌入(Cross-origin embedding)。
通常不允許跨域讀操作(Cross-origin reads)。但??梢酝ㄟ^內(nèi)嵌資源來巧妙的進(jìn)行讀取訪問。例如可以讀取嵌入圖片的高度和寬度,調(diào)用內(nèi)嵌腳本的方法。
另外,同源策略約束了XMLHttpRequest,也就是說ajax進(jìn)行跨域訪問會報錯。
原理: 再瀏覽器中打開一個頁面中,或用iframe打開一個頁面時會創(chuàng)建一個window對象,當(dāng)頁面加載一個新的頁面時,window.name屬性是不會變的,因此我們可以在頁面中動態(tài)創(chuàng)建一個iframe頁面指向另一個域,將數(shù)據(jù)賦值個window.name屬性。(值得注意的是,此時我們無法直接訪問window.name),我們還需要將將iframe的src指向相同域的空白頁面。之后再將iframe刪除就可以了
//http://localhost:3000/request.js function CreateIframe(src, nextsrc){ var iframe = document.createElement("iframe"); var flag = true; iframe.src = src; iframe.style.display = "none"; iframe.onload = function(){ if(flag){ iframe.src = nextsrc; flag = false; }else{ p.innerHTML = iframe.contentWindow.name; iframe.contentWindow.close(); document.body.removeChild(iframe); iframe.src = ""; iframe = null }; }; document.body.appendChild(iframe); } CreateIframe("http://localhost:3001/a.html", "http://localhost:3000/b.html");
//http://localhost:3001/response.js function ajax(url, method){ const xhr = new XMLHttpRequest(); xhr.onload = function(data){ window.name = this.responseText console.log(window.name); } xhr.open(method, url, true); xhr.send(null); } ajax("http://localhost:3001/req", "GET");
原理:通過該document.domain來設(shè)置域名,但是有局限性,也就是一級域名一致才可以。
//http://localhost:3000/request.js document.domain = "http://localhost:3001"; document.getElementById("iframe").onload = function(){ var win = iframe.contentWindow; var doc = win.document; console.log(win.data); }
//http://localhost:3001/response.js document.domain = "http://localhost:3001"; var data = "123";
原理: JSONP實現(xiàn)跨域請求的原理簡單的說,就是動態(tài)創(chuàng)建
//jsonp.js const Jsonp = (() => { function jsonp(url, handle){ let script = document.createElement("script"); script.setAttribute("src", `${url}?callback=${handle}`); document.body.appendChild(script); } return jsonp; })()
//server.js app.get("/", function (req, res) { var callbackName = req.query.callback; // myFunction res.send(callbackName+"({"message": "It is JSONP!"});"); })
PostMessage是HTML5的API,postMessage() 方法被調(diào)用時,會在所有頁面腳本執(zhí)行完畢之后向目標(biāo)窗口派發(fā)一個 MessageEvent 消息。 該MessageEvent消息有四個屬性需要注意: message 屬性表示該message 的類型; data 屬性為 window.postMessage 的第一個參數(shù);origin 屬性表示調(diào)用window.postMessage() 方法時調(diào)用頁面的當(dāng)前狀態(tài); source 屬性記錄調(diào)用 window.postMessage() 方法的窗口信息。
只有通過其他窗口的一個引用,比如iframe的contentWindow屬性、執(zhí)行window.open返回的窗口對象、或者是命名過或數(shù)值索引的window.frames。才能使用
////http://localhost:3000/request.js var popup =window.open("http://localhost:3001/index4.html"); function receive(event){ if(event.origin !== "http://localhost:3001") return; document.querySelector("#message").innerHTML = event.data; } window.addEventListener("message", receive, false);
//http://localhost:3001/response.js var popup = window.opener; popup.postMessage("發(fā)送消息", "http://localhost:3000/"); window.addEventListener("message", (e) => { if(e.origin !== "http://localhost:3001") return; document.querySelector("#message").innerHTML = e.data; //e.source.postMessage("發(fā)送消息", e.origin); }, false)
cors主要靠服務(wù)器,只要服務(wù)器實現(xiàn)了cors接口,就可以跨源通信。具體的原理可以看阮老師的文章跨域資源共享 CORS 詳解
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84873.html
摘要:前言騰訊一面,相比阿里一面來說,騰訊一面先給打電話預(yù)定時間,這也給了我們這些面試者去準(zhǔn)備的時間。其實閉包也就是指有權(quán)訪問另一個函數(shù)作用域的函數(shù)而已。常用的創(chuàng)建閉包的方法就是在函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。 前言 騰訊一面,相比阿里一面來說,騰訊一面先給打電話預(yù)定時間,這也給了我們這些面試者去準(zhǔn)備的時間。但是也正是因為這種確定性,也有在等待電話的時候的心情的忐忑。 背景 我是一名大三學(xué)生,大一...
摘要:所謂同源是指協(xié)議域名端口三者相同,即便兩個不同的域名指向同一個地址,也非同源。那么怎樣解決跨域問題的呢通過跨域跨域跨域跨域跨域資源共享代理跨域中間件代理跨域音樂教程老師有用到協(xié)議跨域后端在頭部信息里面設(shè)置安全域名公司后端給解決過持續(xù)更新中 JavaScript篇 如何獲取瀏覽器URL中查詢字符串中的參數(shù)? 1.封裝方法 getUrlArgs(url) { const args =...
摘要:所謂同源是指協(xié)議域名端口三者相同,即便兩個不同的域名指向同一個地址,也非同源。那么怎樣解決跨域問題的呢通過跨域跨域跨域跨域跨域資源共享代理跨域中間件代理跨域音樂教程老師有用到協(xié)議跨域后端在頭部信息里面設(shè)置安全域名公司后端給解決過持續(xù)更新中 JavaScript篇 如何獲取瀏覽器URL中查詢字符串中的參數(shù)? 1.封裝方法 getUrlArgs(url) { const args =...
摘要:前言秋招宣告結(jié)束,面試了接近家公司,有幸拿到,感謝這段時間一起找工作面試的朋友和陪伴我的人。一定要提前準(zhǔn)備好,不然面試官叫你說遇到的難點,或者直接問問題時可能會懵逼。 前言 秋招宣告結(jié)束,面試了接近20家公司,有幸拿到offer,感謝這段時間一起找工作面試的朋友和陪伴我的人。這是一段難忘的經(jīng)歷,相信不亞于當(dāng)年的高考吧,也許現(xiàn)在想起來高考不算什么,也許只有經(jīng)歷過秋招的人才懂得找工作的艱辛...
摘要:前言秋招宣告結(jié)束,面試了接近家公司,有幸拿到,感謝這段時間一起找工作面試的朋友和陪伴我的人。一定要提前準(zhǔn)備好,不然面試官叫你說遇到的難點,或者直接問問題時可能會懵逼。 前言 秋招宣告結(jié)束,面試了接近20家公司,有幸拿到offer,感謝這段時間一起找工作面試的朋友和陪伴我的人。這是一段難忘的經(jīng)歷,相信不亞于當(dāng)年的高考吧,也許現(xiàn)在想起來高考不算什么,也許只有經(jīng)歷過秋招的人才懂得找工作的艱辛...
閱讀 2396·2019-08-30 15:56
閱讀 1053·2019-08-30 15:55
閱讀 3218·2019-08-30 15:44
閱讀 945·2019-08-30 10:53
閱讀 1903·2019-08-29 16:33
閱讀 2511·2019-08-29 16:13
閱讀 731·2019-08-29 12:41
閱讀 889·2019-08-26 13:56