摘要:基本方式為,求余取余調整長度與鏈接變量進行循環運算。可以借助發送請求,元素作為一種傳輸機制。使用元素調用數據時,必須用函數名和圓括號包裹起來。
中止請求和超時
一個栗子在上傳多少秒以后直接終止請求
// 發起HTTP GEt請求獲取指定URl的內容 // 如果響應成功到達,將會傳入responseText給回調函數 // 如果響應在timeout毫秒內沒有到達,將會中止這個請求 function timedGetText(url, timeout, callback) { var request = new XMLHttpRequest(); // 創建新請求 var timedout = false; // 是否超時,設置標志 // 啟動計時器,在timeout毫秒后將終止請求 var timer = setTimeout(() => { // 設置計時器,將在timeout時間之后執行該操作,不同于直接定義,是直接 timedout = true; // 設置標記 request.abort(); // 直接中止請求 }, timeout); // 直接終止請求 request.open("GET", url); request.onreadystatechange = () => { // 定義事件處理程序,如果事件處理完成,直接終止計時器 if (request.readyState !== 4) return; // 如果此時仍然有沒有下載完成的,直接忽視,等待計時器取消 if (timedout) return; // 確定此時仍然沒有超時,如果此時仍然沒有超時,直接取消 cleraTimeout(timer); // 此時已經執行完成任務,取消計時器 if (request.status === 200) // 對回調函數的處理 callback(request.responseText); // 如果請求成功,將會直接返回成功的文本,并調用回調函數 }; request.send(null); // 直接發送請求(此請求為異步操作) }跨域的HTTP請求
作為同源策略的一部分,XMLHttpRequest對象可以發起HTTP請求,由于同源的影響,導致必須是同源的,
ps script元素不是真正的受到了同源策略的影響,它加載并執行任何來源的腳本,使用ajax的方式為直接script腳本完成
或者依舊可以使用cors的方式跨域訪問網站
一些安全問題如果傳入用戶名和密碼,其不能通過跨域發送(因為這樣可以利用js客戶端的方式,使得分布式破解密碼成為可能)
跨域請求不會包含其他任何的用戶證書
cookie和token 都會被丟棄,如果跨域請求需要這幾種憑證,必須在send方法之前,使用withCredentials
即簽名認證
一次性身份校驗方式,常常用于不同項目之間的api通信
舉例來自百度翻譯的api接口
https://fanyi-api.baidu.com/a...
上方是百度翻譯的api文檔
get請求url如下 http://api.fanyi.baidu.com/ap...
最后一個為簽名,在這里,這個api使用的是md5的 還有一種加密方式為rsa加密
md5 MD5是輸入不定長度信息,輸出固定長度128-bits的算法。經過程序流程,生成四個32位數據,最后聯合起來成為一個128-bits散列。基本方式為,求余、取余、調整長度、與鏈接變量進行循環運算。得出結果。
目前已經被證實可被破解
還有一些哈希算法等其他的加密算法
繼續舉例
https://help.aliyun.com/docum...
上方的是來自于阿里云的一個api
只不過使用的是Hmac SHA1算法加密得到簽名的
HMAC-SHA1 為哈希運算消息認證碼,HMAC運用的是哈希算法,以一個秘鑰和一個消息為輸入,生成一個消息摘要作為輸出。為一種最常用的簽名算法。用于對一段信息生成一段簽名的摘要,在GET或者POST請求內token
token的鑒權流程
https://help.aliyun.com/docum...
整個流程是先通過用戶賬號體系登錄,接著對token認證服務器發送申請token的請求,token的有效期自定義,驗證通過后,直接返回給客戶端token,最后驗證token到要訪問的服務器。即上方為完整的用戶登錄過程
ps 用戶登錄需要進行鑒權
由于http可被局域網抓包,所以一般使用ssl
后方的token會和后端服務器進行token的同步
一篇博文 http://www.cnblogs.com/xiekel...
還有其他,不在說
舉個栗子下方的栗子實現一個簡單的跨域的js請求,使用的是來自于百度翻譯的api
使用的cors
ps 我根本找不到支持cors的api 貌似是瀏覽器不兼容的緣故。。唉。
那就暫時不舉了,總體來說瀏覽器在發現是跨域請求的時候,會自動添加origin頭,如果服務端Access-Control-Allow-Origin 的頭部和origin相同,或者為*號的時候,即可進行同源請求,否則將會拒絕同源請求。
JSONP可以借助script發送HTTP請求,script元素作為一種ajax傳輸機制。
使用script,不會受到同源策略的影響,并且包含JSON編碼數據的響應體會自動解碼
腳本和安全性 使用script元素進行AJAX傳輸,會運行執行發送過來的任何js腳本,這種方式適用于可信的第三方腳本,如廣告,統計等。
使用script元素調用數據時,必須用js函數名和圓括號包裹起來。
使用script元素發送JSONP請求一個栗子
// 根據指定的URL發送一個JSONP請求 function getJSONP(url) { // 為本次請求創建一個唯一的回調函數名稱,將會拼接成 getJSONP.cb3 // 將會拼接成 ?jsonp=getJSONP.cb3 var cbnum = "cb" + getJSONP.counter++; // 自增計算器 var cbname = "getJSONP." + cbnum; // 作為JSONP函數的屬性 // 將回調函數名以表單彪馬的形式添加到url的?后面部分中 // 使用JSONP作為參數名 if (url.indexOf("?") === -1) // 如果url沒有查詢部分 url += "?jsonp=" + cbname; // 進行添加參數,拼接成為完整的url else // 否則 url += "&jsonp" + cbname; // 將會作為新的參數進行添加 // 創建script元素用于發送請求 var script = document.createElement("script"); // 觸發HTTP請求,直接操作DOM創建script節點,讓瀏覽器加載 script.src = url; document.body.appendChild(script); }
總體思路是,直接創建script元素,通過添加src屬性,讓script元素代為發送get請求
查看響應
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108333.html
摘要:私有變量用來臨時存放配置中的,即請求成功后執行的回調函數名,該配置可以為類型。是根據配置得出的回調函數名。接下來,將的占位符,替換成回調函數名,最后將插入到頁面中,發送請求。 Ajax 模塊也是經常會用到的模塊,Ajax 模塊中包含了 jsonp 的現實,和 XMLHttpRequest 的封裝。 讀 Zepto 源碼系列文章已經放到了github上,歡迎star: reading-...
摘要:但是有可能還不太它內部具體是如何實現一個的,從請求的發出,到指定的成功或失敗回調函數的執行。服務端會解析請求的至少拿到一個回調函數比如參數之后將數據放入其中返回給客戶端。 前言 原文地址 倉庫地址 jsonp(JSON with padding)你一定不會陌生,前端向后端拿數據的方式之一,也是處理跨域請求的得利助手。 我們早已習慣,早已熟練了jQ或者zepto的ajax調用方式。但是...
閱讀 1772·2021-11-15 11:37
閱讀 3044·2021-11-04 16:05
閱讀 1910·2021-10-27 14:18
閱讀 2741·2021-08-12 13:30
閱讀 2485·2019-08-29 14:18
閱讀 2076·2019-08-29 13:07
閱讀 2004·2019-08-27 10:54
閱讀 2714·2019-08-26 12:15