AJAX、CORS

課堂筆記

  • 有哪些標(biāo)簽可以用于發(fā)送請(qǐng)求,它們各有哪些特點(diǎn)?
    <form>可以用任意方法提交請(qǐng)求,但提交請(qǐng)求后會(huì)刷新頁面或新開頁面
    <a>可以發(fā)GET請(qǐng)求,但提交請(qǐng)求后會(huì)刷新頁面或新開頁面
    <img>可以發(fā)GET請(qǐng)求,但只能以圖片形式展示
    <link>可以發(fā) GET 請(qǐng)求,但是只能以 CSS、favicon 的形式展示
    <script>可以發(fā) GET 請(qǐng)求,但是只能以腳本的形式運(yùn)行
    有沒有一種發(fā)請(qǐng)求的方式,可以以任意方法,任意形式展示?有,那就是AJAX
  • AJAX:async Javascript and XML
    ① 使用 XMLHttpRequest 發(fā)請(qǐng)求
    ② 服務(wù)器返回 XML 格式的字符串(包括但不只是XML格式)
    ③ JS 解析 XML,并更新局部頁面

怎么實(shí)現(xiàn)

let request = new XMLHttpRequest()
request.open(方法,路徑)//配置請(qǐng)求。其中方法(大小寫無所謂)、路徑均是字符串。路徑可以可以是相對(duì),絕對(duì)路徑,瀏覽器會(huì)自動(dòng)轉(zhuǎn)為絕對(duì)路徑
request.send()//發(fā)送請(qǐng)求。
  • request.status() 在請(qǐng)求結(jié)束后返回響應(yīng)狀態(tài)碼:200、404等

  • request.readyState()返回請(qǐng)求與響應(yīng)當(dāng)前所處狀態(tài)

    request.readyState

  • request.responseText() 以字符串的形式返回響應(yīng)的第四部分

  • requset.onreadystatechange()

  • 請(qǐng)求與響應(yīng)并非是一次性全部發(fā)送的,而是分部分發(fā)送的,響應(yīng)的第一部分就已經(jīng)包含請(qǐng)求是否成功的信息。所以是先有request.status后有request.readyState

  • JSON
    被開發(fā)出來代替XML稱為數(shù)據(jù)交換語言
    語法與JS相似(抄襲JS的)
    ①數(shù)據(jù)類型有: string,number,boolean,object,array
    ②字符串必須加雙引號(hào)
    window.JSON.parse(字符串)用于解析符合JSON語法的字符串

  • console.time() console.timeEnd()把代碼放在兩個(gè)函數(shù)之間,可以大致計(jì)算代碼運(yùn)行所需時(shí)間

  • AJAX是受同源策略限制的
    同源策略即:只有相同協(xié)議,域名,端口的兩個(gè)源(頁面,包括后臺(tái)數(shù)據(jù))可以進(jìn)行資源交互
    不符合同源策略的AJAX其request.status() === 0

  • 為什么用<form>發(fā)請(qǐng)求不受同源策略的影響,而AJAX請(qǐng)求則不行

    解答

    其實(shí)不受同源策略限制的標(biāo)簽還包括:<script> <img> <link>
    這仍然可能會(huì)存在安全漏洞
    因此谷歌會(huì)采用 CORB 策略來保護(hù) xml,html,json 的內(nèi)容
    詳見:https://segmentfault.com/a/1190000016126079

  • 對(duì)象屬性增強(qiáng)

ES5中:
var x = 'sss'
var o = {}
o[x] = 1
ES6中:
var x = 'sss'
var o = {[x]:1}

CORS

corss-orign resource sharing 跨域資源共享
要讓不同源的兩個(gè)頁面實(shí)現(xiàn)資源共享怎么做?(此時(shí)會(huì)發(fā)送請(qǐng)求,但不會(huì)有響應(yīng))
這時(shí)候要用到CORS。
CORS請(qǐng)求分為兩種一種簡(jiǎn)單請(qǐng)求,一種非簡(jiǎn)單請(qǐng)求
滿足以下條件的被稱為簡(jiǎn)單請(qǐng)求

(1) 請(qǐng)求方法是以下三種方法之一:
HEAD
GET
POST
(2)HTTP的頭信息不超出以下幾種字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三個(gè)值application/x-www-form-urlencoded、multipart/form-data、text/plain

對(duì)于簡(jiǎn)單請(qǐng)求,瀏覽器在請(qǐng)求頭中添加Origin,將url附上,如果該url不被后端允許跨域,則響應(yīng)中沒有Access-Control-Allow-Origin字段,若允許,則有上述字段。

后端通過response.setHeader('Access-Control-Allow-Origin',路徑) 將允許資源共享的url提前設(shè)置好

CORS比JSONP更強(qiáng)大

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容