【基礎類】—前后端通信類系統性學習

一、什么是同源策略及限制

  1. 同源策略限制從一個源加載的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用于隔離潛在惡意文件的關鍵的安全機制。
  2. 源:協議、域名和端口, 默認端口是80
    三者有一個不同,即源不同,就是跨域
https://www.baidu.com:80/
https://www.baidu.com:8080
// 不同源
  1. 限制:不是一個源的文檔,你沒有權利去操作另一個源的文檔,主要限制方面
    3-1. Cookie、LocalStorage 和 IndexDB 無法讀取
    3-2. DOM無法獲得
    3-3. Ajax 請求不能發送

二、前后端如何通信

  1. Ajax
    同源下通信方式
  2. WebSocket
    支持同源和跨域通信
  3. CORS
    支持同源和跨域通信

三、如何創建Ajax

  1. XMLHttpRequest 對象的工作流程
    1-1 聲明對象,兼容IE
    1-2 根據請求方式的不同,設置不同傳參方式
    1-3 open方法,確定發送的方式、地址、是否異步
    1-4 send方法,發送請求
    1-5 監聽響應狀態變化, 處理返回數據
 /*** [json 實現ajax的json]* @param  {[type]} options [description]* @return {[type]}         [description]*/util.json = function (options) {var opt = {url: '',type: 'get',data: {},success: function () {},error: function () {},};util.extend(opt, options);if (opt.url) {// ①聲明對象,兼容IEvar xhr = XMLHttpRequest? new XMLHttpRequest(): new 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 + '?' + dataArr.join('&');// ③ open方法,確定發送的方式、地址、是否異步xhr.open(type, url.replace(/\?$/g, ''), true);// ④ send方法,發送請求xhr.send();}if (type === 'POST') {xhr.open(type, url, true);xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');xhr.send(dataArr.join('&'));}// ⑤ 監聽響應狀態變化xhr.onload = function () {// ⑥ 處理返回數據, 200表示成功返回 304表示緩存中讀取, 如果請求是媒體資源,還需要判斷206,因為媒體資源是分段返回的if (xhr.status === 200 || xhr.status === 304) {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);}}};}};
  1. 兼容性處理
  2. 事件的觸發條件
  3. 事件的觸發順序

四、跨域通信的幾種方式

1.JSONP

  1. JSONP: 再出來postMessage之前,一直使用JSONP進行跨域通信
  2. JSONP 原理: 利用script標簽的異步加載來實現的
  3. JSONP 具體的實現邏輯
    3-1 向服務端發送請求,并告訴服務端callback的名稱
<script src="http:www.abc.com/?callback=jsonp"></script>

3-2 服務端返回數據,全局注冊jsonp函數,同時執行本地jsonp函數

<script src="http:www.abc.com/?callback=jsonp"></script>
<script>jsonp({data: {}})
</script>
  1. 代碼實現步驟
    4-1 確定回調函數的名稱
    4-2 根據名稱注冊全局函數
    4-3 動態創建scrpit標簽
    4-4 監聽腳本的加載事件
    4-5 監聽加載是否成功,成功后,刪除該script標簽,同時刪除全局函數
    4-6 往html里面新增script標簽,發送請求

  2. 具體代碼實現

  /*** [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');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);};

2.Hash

  1. Hash: url中,#號后面的東西為hash, hash的變動,頁面不會刷新
  2. search: url中,?號后面的東西叫search,search的改變,頁面會刷新,所以search不能做跨域通信
  3. 使用hash通信 代碼實現
// 利用hash,場景是當前頁面 A 通過iframe或frame嵌入了跨域的頁面 B// 在A中偽代碼如下:var B = document.getElementsByTagName('iframe');B.src = B.src + '#' + 'data';// 在B中的偽代碼如下window.onhashchange = function () {var data = window.location.hash;};

3.postMessage

  1. postMessage:同源策略是限制跨域通信,實際業務中又需要跨域通信,使用postMessage實現跨域通信,H5新出的
  2. postMessage代碼實現
// postMessage// 窗口A(http:A.com)向跨域的窗口B(http:B.com)發送信息Awindow.postMessage('data', 'http://B.com');// 在窗口B中監聽Bwindow.addEventListener('message', function (event) {console.log(event.origin); // 確定發送的源, http://A.comconsole.log(event.source); // A window的引用console.log(event.data); // data}, false);

4.WebSocket

  1. WebSocket:支持跨域通信
  2. WebSocket 代碼實現
// Websocket【參考資料】http://www.ruanyifeng.com/blog/2017/05/websocket.html// wss 服務器地址var ws = new WebSocket('wss://echo.websocket.org');// 發送請求ws.onopen = function (evt) {console.log('Connection open ...');ws.send('Hello WebSockets!');};// 接收消息ws.onmessage = function (evt) {console.log('Received Message: ', evt.data);ws.close();};// 關閉連接ws.onclose = function (evt) {console.log('Connection closed.');};

5.CORS

  1. CORS:支持跨域通信的Ajax
// CORS【參考資料】http://www.ruanyifeng.com/blog/2016/04/cors.html// url(必選),options(可選)fetch('/some/url/', {method: 'get',}).then(function (response) {}).catch(function (err) {// 出錯了,等價于 then 的第二個參數,但這樣更好用更直觀});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35820.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Stable Diffusion+Temporal-kit 半虛半實應用

1.先下載temporal-kit,重啟webui 2.下載好ffmpeg,配置好環境,下載Ebsynth 3.準備好你需要的視頻,拖到預處理視頻位置 4.填寫參數,點解保存設置,然后并點擊生成,會生成到目標文件夾的input位置 5.然后拉出input文件夾里面你想切換成處理的幀圖片,然后填寫prompt查看效…

中國省級、城市-數字經濟創新創業、分項指數(2010-2020年)

一、數據介紹 數據名稱&#xff1a;中國省級、城市-數字經濟創新創業、分項指數 數據年份&#xff1a;2010-2020年 數據范圍&#xff1a;31省、336個城市 數據來源&#xff1a;北大企業大數據研究中心 二、參考文獻 參考文獻&#xff1a; 戴若塵,王艾昭,陳斌開.中國數字…

Win10使用Guest和空密碼訪問共享的完整步驟

目錄 前言 啟動Guest 給予Guest網絡權限 允許空密碼登陸 啟用不安全的來并登陸 總結 前言 我們經常需要使用空密碼和guest賬戶訪問Windows共享&#xff0c;因為某些設備不支持輸入密碼等&#xff0c;那么該如何設置呢&#xff0c;因為步驟比較固定而且繁瑣&#xff0c;于…

Python小白入門:文件、異常處理和json格式存儲數據

這里寫自定義目錄標題 所用資料 一、從文件中讀取數據1.1 讀取整個文件1.2 文件路徑1.3 逐行讀取1.4 創建一個包含文件各行內容的列表1.5 使用文件的內容1.6 包含一百萬位的大型文件1.7 圓周率值中包含你的生日嗎練習題 二、寫入文件2.1 寫入空文件2.2 寫入多行2.3 附加到文件練…

Maven 生成(打包)帶有依賴的可以直接執行的一個 jar 包

在pom中增加如下內容 <build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifest><mainClass>com.example.xxx.YourClass</mainClass></manifest></…

酷開系統丨酷開會員,帶你解鎖K歌新姿勢

不管時代怎么變化&#xff0c;K歌這項娛樂活動始終深受人們的喜愛。不知道你有沒有遇到過這種情況&#xff1a;周末在家宅了一天&#xff0c;突然心血來潮想去KTV唱歌&#xff0c;但奈何外面過于悶熱實在不想出門&#xff0c;可在手機上唱歌又不過癮&#xff0c;讓人很是苦惱……

tomcat入門介紹

tomcat官網下載8.5.9版本&#xff0c;官網地址&#xff1a;https://tomcat.apache.org/download-80.cgi 下載完成后直接解壓即可 tomcat目錄 解壓后&#xff0c;可以看到tomcat有以下目錄 /bin - 啟動、關閉和其他腳本 *.sh后綴是linux下的腳本文件*.bat后綴windows系統下的…

繪畫AI工具的介紹與使用----強到離譜-2023年必備免費好用的AI工具

一.繪畫AI www.seaart.ai 這個是網站地址&#xff0c;進去之后直接注冊登錄即可&#xff0c;幾乎都是免費使用&#xff0c;不用擔心是否要VIP 點擊網站進入之后登錄&#xff0c;然后進入主頁面&#xff0c;一張圖片給你介紹清楚主頁 我會根據菜單欄來給大家演示&#xff0c;首…

web會話跟蹤以及JWT響應攔截機制

目錄 JWT 會話跟蹤 token 響應攔截器 http是無狀態的&#xff0c;登錄成功后&#xff0c;客戶端就與服務器斷開連接&#xff0c;之后再向后端發送請求時&#xff0c;后端需要知道前端是哪個用戶在進行操作。 JWT Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而…

Unity特效總覽

一、粒子 Unity中的粒子組件叫做Particle System。 粒子系統顧名思義&#xff0c;與“微粒”有關。粒子系統會生成和發射很多粒子&#xff0c;通過控制粒子的生成數量、大小、角度、速度、貼圖和顏色等眾多屬性&#xff0c;可以實現或真實或炫酷的各種效果。其中&#xff0c;…

leetcode做題筆記76最小覆蓋子串

給你一個字符串 s 、一個字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串&#xff0c;則返回空字符串 "" 。 注意&#xff1a; 對于 t 中重復字符&#xff0c;我們尋找的子字符串中該字符數量必須不少于 t 中該字符數量。如果…

【Unity】VS Code 沒有智能提示 Unity 中的類

正常來說&#xff0c;VS Code中會對部分輸入類名進行提示&#xff0c;如下圖所述 假如你從Unity 中進入 VS Code后發現沒有提示相關 Unity的類&#xff0c;可能是 Unity 中 有關于 VS Code的相關Package 沒有跟著 VS Code升級到最新版本。 點擊Unity Windows 下拉框中的 Pac…

如何在電力行業運用IPD?

電力行業是國民經濟眾多壟斷行業中較早實施改革的行業之一。近幾年我國電力行業保持著較快的發展速度&#xff0c;也取得了很大的成績&#xff0c;發電機容量和發電量居世界首位。2015-2020年&#xff0c;全國發電量不斷攀升。 電力是以電能作為動力的能源。電力的發現和應用掀…

簡繪ChatGPT支持Midjourney繪圖 支持stable diffusion繪圖

簡繪支持Midjourney繪圖和stable diffusion繪圖。 這意味著簡繪具備Midjourney繪圖和stable diffusion繪圖功能的支持。

生信豆芽菜-單基因表達比較

網址&#xff1a;http://www.sxdyc.com/panCancerExpCom 該工具主要用于查看單基因在泛癌的癌組織和癌旁組織中表達比較&#xff0c;可以只選擇TCGA數據庫&#xff0c;也可以選擇TCGAGTEx數據庫&#xff08;GTEx數據庫&#xff0c;存放了正常組織全基因的表達譜&#xff09; …

人類智能的三個基本要素

人類智能的三個基本要素包括&#xff1a;適應性、靈活性和從稀疏觀察中做出一般推斷的能力。這些要素使得智能系統能夠適應不同的環境和任務&#xff0c;處理多樣性和復雜性&#xff0c;并從有限的信息中進行學習和推理&#xff0c;對于構建更強大和智能的人工智能系統至關重要…

ERROR: While executing gem ... (Gem::FilePermissionError)

sudo gem install -n /usr/local/bin cocoapodsERROR: While executing gem ... (Gem::FilePermissionError)You dont have write permissions for the /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/gems/2.6.0 directory.解決辦法&#xff1a; 1.刪…

limereport報表使用

在這里我使用報表是以報表的形式顯示數據庫的信息。所以首先需要準備的資料有&#xff1a;limereport源碼&#xff0c;還有數據庫&#xff0c;我這里使用的是qsqlite數據庫。 1、下載limereport報表源碼 2、運行自帶的案例&#xff1a;demo_r1 3、點擊 “Run Report Designer”…

【Spring專題】手寫簡易Spring容器過程分析——引導篇

目錄 前言說在前面閱讀準備 思路整理手寫源碼示例一、手寫前的準備1.1 注解1.2 測試Bean1.3 調用實例 二、構造方法&#xff08;構建基本流程&#xff09;三、實現scan()方法3.1 doGetScanPackage()&#xff1a;獲取掃描路徑3.2 doLoadClassFromDiskAndScan()&#xff1a;從電腦…

HTML大于號、小于號、空格、引號等常用的轉義代碼寫法

在這里插入代碼片HTML 原始碼 顯示結果 描述 < < 小於號或顯示標記 > > 大於號或顯示標記 &amp; & 可用於顯示其它特殊字符 &quot; " 引號 &reg; 己注冊 © © 版權 &trade; ? 商標 &ensp; 半…