摘要:通信類什么是同源策略及限制同源策略限制從一個源加載的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用于隔離潛在惡意文件的關鍵的安全機制。源協議域名端口默認三個構成一個源。
通信類 javascript HTTP 1. 什么是同源策略及限制:
同源策略限制從一個源加載的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用于隔離潛在惡意文件的關鍵的安全機制。
源:協議、域名、端口(默認 80)三個構成一個源。 不是一個源的文檔無法去操作另一個源的資源。
限制:
- Cookie、LocalStorage 和 IndexDB - Dom 無法獲得 - Ajax 不能發送2. 前后端如何通信:
Ajax 同源下
WebSocket 不限制
CORS 支持跨源通信 也支持同源通信
3. 如何創建Ajax:XMLHttpRequest 對象的工作流程
兼容性處理(IE 瀏覽器的處理)
事件的觸發條件
事件的觸發順序
if(opt.url){ // 聲明XMLHttpRequest 對象的工作流程 var xhr = XMLHttpRequest ? new XMLHttpRequest () : new window.ActiveXObject("Microsoft.XMLHTTP"); var data = opt.data, url = opt.url, type = opt.type.toUpperCase(), dataArr = []; for (var k in data) { dataArr.push(k + "=" + data[k]); } if (type === "GET") { url = url +"?" + dataArry.join("&"); xhr.open(type,url.replace(/?$/g,""),true); xhr.send(); } if (type === "POST") { xhr.open(type,url,true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhr.send(dataArry.join("&")); } // 監聽它成功失敗 xhr.onload = function () { // 200:304:重定向,利用本地緩存 if (xhr.status === 200 || xhr.status === 304 ) { // 媒體資源加206 var res; if (opt.success && opt.success instanceof Function) { res = xhr.responseText; if(typeof res === "String") { res = JSON.parse(res); opt.success.call(xhr,res); } } } else { if (opt.error && opt.error instanceof Function) { opt.error.call(xhr,res); } } } }4. 跨域通信的幾種方式:
JSONP
Hash 「url 地址中 # 后面的東西是 Hash, Hash改變頁面不改變」「url 地址中 ?后面的東西是Search,Search 改變頁面刷新」
postMessage「Html5 新增的,同源策略限制跨域通信,但實際的開發業務中我們又需要用到跨域通信,所以出現這種方式」
WebSocket「不受同源策略限制」
CORS 「支持跨域通信的 Ajax ,瀏覽器在識別你用Ajax發送跨域請求時,瀏覽器會在 HTTP 頭中加一個 Origin,如果沒有瀏覽器就會攔截」
代碼實例:var util = {}; /** * [function 在頁面中注入js腳本] * @param {[type]} url [description] * @param {[type]} charset [description] * @return {[type]} [description] */ util.createScript = function (url, charset) { var script = document.createElement("script"); script.setAttribute("type", "text/javascript"); charset && script.setAttribute("charset", charset); script.setAttribute("src", url); script.async = true; return script; }; /** * [function jsonp] * @param {[type]} url [description] * @param {[type]} onsucess [description] * @param {[type]} onerror [description] * @param {[type]} charset [description] * @return {[type]} [description] */ util.jsonp = function (url, onsuccess, onerror,charset) { var callbackName = util.getName("tt_player"); // 加載script標簽的形式 window[callbackName] = function () { // 以這個回調名稱注冊一個全局的函數 if (onsuccess && util.isFunction(onsuccess)){ onsuccess(arguments[0]); } }; var script = util.createScript(url + "&callback" + callbackName,charset); script.onload = script.onreadystatechange = function () { if (!script.readyState || /loaded|complete/.test(script.readyState)) { script.onload = script.onreadystatechange = null; // 移除該script的 DOM 對象 if (script.parentNode) { script.parentNode.removeChild(script); } // 刪除函數或變量 window[callbackName] = null; } }; script.onerror = function () { if (onerror && util.isFunction(onerror)) { onerror(); } }; document.getElementsByTagName("head")[0].appendChild(script); }; // AJAX util.extend(opt,options); if(opt.url){ // 聲明XMLHttpRequest 對象的工作流程 var xhr = XMLHttpRequest ? new XMLHttpRequest () : new window.ActiveXObject("Microsoft.XMLHTTP"); var data = opt.data, url = opt.url, type = opt.type.toUpperCase(), dataArr = []; for (var k in data) { dataArr.push(k + "=" + data[k]); } if (type === "GET") { url = url +"?" + dataArry.join("&"); xhr.open(type,url.replace(/?$/g,""),true); xhr.send(); } if (type === "POST") { xhr.open(type,url,true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhr.send(dataArry.join("&")); } // 監聽它成功失敗 xhr.onload = function () { // 200:客戶端請求成功 304:重定向,利用本地緩存 if (xhr.status === 200 || xhr.status === 304 ) { // 媒體資源加206 var res; if (opt.success && opt.success instanceof Function) { res = xhr.responseText; if(typeof res === "String") { res = JSON.parse(res); opt.success.call(xhr,res); } } } else { if (opt.error && opt.error instanceof Function) { opt.error.call(xhr,res); } } } } export default util;
通信類
License
可以拷貝、轉發,但是必須提供原作者信息,同時也不能將本項目用于商業用途。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93275.html
摘要:而實際兩者之間的通信使用的是基于的自定義二進制數據幀,對象與數據幀之間需進行轉換。該類實現了編碼解碼方法,故可對消息對象進行編碼或對數據幀進行解碼。該類的靜態方法可通過指定功能消息對象生成相應的回復對象。 本文為該系列的第二篇文章,設計需求為:服務端程序和眾多客戶端程序通過 TCP 協議進行通信,通信雙方需通信的消息種類眾多。上一篇文章詳細描述了該通信協議的二進制數據幀格式以及基本 J...
摘要:方式是最常用也是最直接的通常用于方法,其實我認為中的表單實質上也是方式,但這種傳輸方式數據有限,也不規范,只適合一些簡單場景。如何封裝上面講了,和是目前主流的通信數據格式,下面就來講講如何封裝,方便運用。 謝謝大家的收藏與贊,這是對我最大的鼓勵。 必要性 不管在B/S架構中,還是C/S架構中,兩端的數據通信(注:這里的通信是指的網絡請求和回復操作)都無可避免,因為沒有數據便沒有內容,沒...
摘要:方式是最常用也是最直接的通常用于方法,其實我認為中的表單實質上也是方式,但這種傳輸方式數據有限,也不規范,只適合一些簡單場景。如何封裝上面講了,和是目前主流的通信數據格式,下面就來講講如何封裝,方便運用。 謝謝大家的收藏與贊,這是對我最大的鼓勵。 必要性 不管在B/S架構中,還是C/S架構中,兩端的數據通信(注:這里的通信是指的網絡請求和回復操作)都無可避免,因為沒有數據便沒有內容,沒...
摘要:那在我們的程序設計中有沒有這樣的模式有的,中介者模式應運而生,目的就是處理這樣的情景問題。最后來看客戶端的實現,代碼如下被攻打,請求支援可以看到,表面上請求還是從發出,但是已經委托了中介者進行業務邏輯和流程的處理。 本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家發布 小時候鐘愛戰爭片,《地道戰》、《雞毛信》、《鐵道游擊隊》一系列的老電影,咦~想起都激動得起雞皮疙瘩。不過...
閱讀 2947·2021-09-23 11:32
閱讀 2918·2021-09-22 15:12
閱讀 1708·2019-08-30 14:07
閱讀 3448·2019-08-29 16:59
閱讀 1640·2019-08-29 11:11
閱讀 2307·2019-08-26 13:50
閱讀 2426·2019-08-26 13:49
閱讀 2621·2019-08-26 11:49