摘要:是的,方法被調用時,會在所有頁面腳本執行完畢之后向目標窗口派發一個消息。該消息有四個屬性需要注意屬性表示該的類型屬性為的第一個參數屬性表示調用方法時調用頁面的當前狀態屬性記錄調用方法的窗口信息。
1.為什么要跨域
同源策略限制一個源加載的文檔或文檔與來自另一個源的資源進行交互。這是一個用于隔離潛在惡意文件的安全機制。
什么是同源呢? 如果協議,端口(如果指定了一個)和域名對于兩個頁面是相同的,則兩個頁面具有相同的源。
下表給出了相對http://store.company.com/dir/...同源檢測的示例:
跨域網絡訪問通常分為3種
通常允許進行跨域寫操作(Cross-origin writes)。例如鏈接(links),重定向以及表單提交。特定少數的HTTP請求需要添加 preflight。
通常允許跨域資源嵌入(Cross-origin embedding)。
通常不允許跨域讀操作(Cross-origin reads)。但??梢酝ㄟ^內嵌資源來巧妙的進行讀取訪問。例如可以讀取嵌入圖片的高度和寬度,調用內嵌腳本的方法。
另外,同源策略約束了XMLHttpRequest,也就是說ajax進行跨域訪問會報錯。
原理: 再瀏覽器中打開一個頁面中,或用iframe打開一個頁面時會創建一個window對象,當頁面加載一個新的頁面時,window.name屬性是不會變的,因此我們可以在頁面中動態創建一個iframe頁面指向另一個域,將數據賦值個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來設置域名,但是有局限性,也就是一級域名一致才可以。
//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實現跨域請求的原理簡單的說,就是動態創建
//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() 方法被調用時,會在所有頁面腳本執行完畢之后向目標窗口派發一個 MessageEvent 消息。 該MessageEvent消息有四個屬性需要注意: message 屬性表示該message 的類型; data 屬性為 window.postMessage 的第一個參數;origin 屬性表示調用window.postMessage() 方法時調用頁面的當前狀態; source 屬性記錄調用 window.postMessage() 方法的窗口信息。
只有通過其他窗口的一個引用,比如iframe的contentWindow屬性、執行window.open返回的窗口對象、或者是命名過或數值索引的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("發送消息", "http://localhost:3000/"); window.addEventListener("message", (e) => { if(e.origin !== "http://localhost:3001") return; document.querySelector("#message").innerHTML = e.data; //e.source.postMessage("發送消息", e.origin); }, false)
cors主要靠服務器,只要服務器實現了cors接口,就可以跨源通信。具體的原理可以看阮老師的文章跨域資源共享 CORS 詳解
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84873.html
摘要:前言騰訊一面,相比阿里一面來說,騰訊一面先給打電話預定時間,這也給了我們這些面試者去準備的時間。其實閉包也就是指有權訪問另一個函數作用域的函數而已。常用的創建閉包的方法就是在函數內部創建另一個函數。 前言 騰訊一面,相比阿里一面來說,騰訊一面先給打電話預定時間,這也給了我們這些面試者去準備的時間。但是也正是因為這種確定性,也有在等待電話的時候的心情的忐忑。 背景 我是一名大三學生,大一...
摘要:所謂同源是指協議域名端口三者相同,即便兩個不同的域名指向同一個地址,也非同源。那么怎樣解決跨域問題的呢通過跨域跨域跨域跨域跨域資源共享代理跨域中間件代理跨域音樂教程老師有用到協議跨域后端在頭部信息里面設置安全域名公司后端給解決過持續更新中 JavaScript篇 如何獲取瀏覽器URL中查詢字符串中的參數? 1.封裝方法 getUrlArgs(url) { const args =...
摘要:所謂同源是指協議域名端口三者相同,即便兩個不同的域名指向同一個地址,也非同源。那么怎樣解決跨域問題的呢通過跨域跨域跨域跨域跨域資源共享代理跨域中間件代理跨域音樂教程老師有用到協議跨域后端在頭部信息里面設置安全域名公司后端給解決過持續更新中 JavaScript篇 如何獲取瀏覽器URL中查詢字符串中的參數? 1.封裝方法 getUrlArgs(url) { const args =...
閱讀 2380·2019-08-30 15:56
閱讀 1038·2019-08-30 15:55
閱讀 3202·2019-08-30 15:44
閱讀 932·2019-08-30 10:53
閱讀 1887·2019-08-29 16:33
閱讀 2468·2019-08-29 16:13
閱讀 719·2019-08-29 12:41
閱讀 874·2019-08-26 13:56