摘要:跨域源資源共享同源域名端口協(xié)議均相同基本思想是使用自定義的頭部,讓服務(wù)器能聲明允許訪問(wèn)的來(lái)源。簡(jiǎn)單請(qǐng)求所有的跨域請(qǐng)求簡(jiǎn)單或非簡(jiǎn)單總會(huì)包含一個(gè)的請(qǐng)求頭部由瀏覽器添加不受用戶控制。
跨域源資源共享
同源:域名、端口、協(xié)議均相同
CORS基本思想是使用自定義的HTTP頭部,讓服務(wù)器能聲明允許訪問(wèn)的來(lái)源。
使用CORS時(shí),異步請(qǐng)求會(huì)被分為簡(jiǎn)單請(qǐng)求(非Preflight)和非簡(jiǎn)單請(qǐng)求。
所有的跨域請(qǐng)求(簡(jiǎn)單或非簡(jiǎn)單)總會(huì)包含一個(gè)origin的請(qǐng)求頭部,由瀏覽器添加不受用戶控制。值由協(xié)議、域名、端口組成,說(shuō)明請(qǐng)求的來(lái)源。下面為一個(gè)Origin頭部示例:
Origin:http://www.hello.com
服務(wù)器接受這個(gè)請(qǐng)求,會(huì)在響應(yīng)頭Access-Control-Allow-Origin回發(fā)相同的源信息。( * 表明該資源可以被任意外域訪問(wèn))
Access-Control-Allow-Origin:http://www.hello.com非簡(jiǎn)單請(qǐng)求
非簡(jiǎn)單CORS請(qǐng)求會(huì)在正式請(qǐng)求之前發(fā)送一次Preflight請(qǐng)求,得到確認(rèn)之后才會(huì)發(fā)送真正的XMLHttpRequest請(qǐng)求。瀏覽器自動(dòng)處理這兩個(gè)請(qǐng)求,并且Preflight請(qǐng)求結(jié)束后,結(jié)果將按照響應(yīng)中指定的時(shí)間緩存起來(lái).所以只是第一次發(fā)送這種請(qǐng)求時(shí)會(huì)多一次HTTP請(qǐng)求.
Preflight請(qǐng)求使用OPTIONS方法,發(fā)送下列頭部:
Origin:與簡(jiǎn)單請(qǐng)求相同 Access-Control-Request-Method:請(qǐng)求自身使用的方法
以下是一個(gè)帶有自定義頭部Custom-Header的使用POST方法發(fā)送的請(qǐng)求.
Origin:http://www.hello.com Access-Control-Request-Method:POST Access-Control-Request-Headers:Custom-Header
var url = "http://www.hello.com"; var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader("Custom-Header", "value"); xhr.send();
服務(wù)器通過(guò)在響應(yīng)中發(fā)送如下頭部與瀏覽器溝通:
Access-Control-Allow-Origin:http://www.hello.com Access-Control-Allow-Methods:POST,GET Access-Control-Allow-Headers:Custom-Header Access-Control-Allow-Max-Age:28000 //表示將Preflight緩存的時(shí)長(zhǎng)(秒),期間內(nèi)無(wú)需再次發(fā)送預(yù)請(qǐng)求
另外通過(guò)將XMLHttpRequest的withCredentials屬性設(shè)置為true就可以發(fā)送帶憑據(jù)(cookie、HTTP認(rèn)證、客戶端SSL證明等)的跨域請(qǐng)求.
var xhr=new XMLHttpRequest(); xhr.withCredentials=true;
如果服務(wù)器接受帶憑據(jù)的請(qǐng)求會(huì)用下面的HTTP頭部響應(yīng):
Access-Control-Allow-Credentials:trueJSONP(JSON with padding)
JSONP由兩部分組成:回調(diào)函數(shù)+數(shù)據(jù),回調(diào)函數(shù)是當(dāng)響應(yīng)到來(lái)時(shí)應(yīng)該在頁(yè)面中調(diào)用的函數(shù),回調(diào)函數(shù)的名字一般是在請(qǐng)求中指定的.而數(shù)據(jù)就是傳入回調(diào)函數(shù)中的JSON數(shù)據(jù).JSONP是通過(guò)動(dòng)態(tài)元素,為其src屬性指定一個(gè)跨域的URL.
function doSomething(response) { console.log(response); } var script=document.createElement("script"); script.src="http://www.hello.com?callback=doSomething"; document.body.insertBefore(script,document.body.firstChild);
1.定義方法doSomething,然后把doSomething傳給服務(wù)器,告知服務(wù)器我需要調(diào)用doSomething方法.
2.服務(wù)端生成JSON.將JSON數(shù)據(jù)以參數(shù)的形式放到doSomething中,這樣就生成了一段js腳本返回給客戶端.
3.客戶端瀏覽器解析script標(biāo)簽,執(zhí)行doSomething(JSON)
otherWindow.postMessage(message, targetOrigin);
otherWindow:指目標(biāo)窗口,也就是給哪個(gè)window發(fā)消息,是window.frames屬性的成員或者由 window.open 方法創(chuàng)建的窗口.
參數(shù)說(shuō)明:message: 是要發(fā)送的消息,類(lèi)型為 String、Object (IE8、9 不支持);targetOrigin: 是限定消息接收范圍,不限制請(qǐng)使用*
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/93657.html
摘要:在接觸前端開(kāi)發(fā)起,跨域這個(gè)詞就一直以很高的頻率在我們學(xué)習(xí)工作中重復(fù)出現(xiàn),最近在工作中遇到了跨域的相關(guān)問(wèn)題,這里我把它總結(jié)記錄一下。 在接觸前端開(kāi)發(fā)起,跨域這個(gè)詞就一直以很高的頻率在我們學(xué)習(xí)工作中重復(fù)出現(xiàn),最近在工作中遇到了跨域的相關(guān)問(wèn)題,這里我把它總結(jié)記錄一下。關(guān)于跨域,有N種類(lèi)型,現(xiàn)在我只專(zhuān)注于ajax請(qǐng)求跨域(ajax跨域只是屬于瀏覽器同源策略中的一部分,其它的這里不做介紹),內(nèi)容...
摘要:關(guān)于,強(qiáng)烈推薦閱讀跨域資源共享詳解阮一峰另外,這里也整理了一個(gè)實(shí)現(xiàn)原理圖簡(jiǎn)化版如何判斷是否是簡(jiǎn)單請(qǐng)求瀏覽器將請(qǐng)求分成兩類(lèi)簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求。 前言 從剛接觸前端開(kāi)發(fā)起,跨域這個(gè)詞就一直以很高的頻率在身邊重復(fù)出現(xiàn),一直到現(xiàn)在,已經(jīng)調(diào)試過(guò)N個(gè)跨域相關(guān)的問(wèn)題了,16年時(shí)也整理過(guò)一篇相關(guān)文章,但是感覺(jué)還是差了點(diǎn)什么,于是現(xiàn)在重新梳理了一下。 個(gè)人見(jiàn)識(shí)有限,如有差錯(cuò),請(qǐng)多多見(jiàn)諒,歡迎提出iss...
摘要:需注意的是由于同源策略的限制,所讀取的為跨域請(qǐng)求接口所在域的,而非當(dāng)前頁(yè)。目前,所有瀏覽器都支持該功能需要使用對(duì)象來(lái)支持,也已經(jīng)成為主流的跨域解決方案。反向代理接口跨域跨域原理同源策略是瀏覽器的安全策略,不是協(xié)議的一部分。 什么是跨域? 跨域是指一個(gè)域下的文檔或腳本試圖去請(qǐng)求另一個(gè)域下的資源,這里跨域是廣義的。 廣義的跨域: 1.) 資源跳轉(zhuǎn): A鏈接、重定向、表單提交 2.) 資源...
摘要:用于告知瀏覽器可以將預(yù)先檢查請(qǐng)求返回結(jié)果緩存的時(shí)間,在緩存有效期內(nèi),瀏覽器會(huì)使用緩存的預(yù)先檢查結(jié)果判斷是否發(fā)送跨域請(qǐng)求。 跨域,老生常談的問(wèn)題 簡(jiǎn)述 作為一只前端菜鳥(niǎo),跨域方面只懂得JSONP和CORS,并未曾深入了解。但隨著春招越來(lái)越近,就算是菜鳥(niǎo)也要猛振翅膀。近幾日仔細(xì)研究了跨域問(wèn)題,寫(xiě)下這篇文章,希望對(duì)開(kāi)發(fā)者們有所幫助。在讀本文前,希望您對(duì)以下知識(shí)略有了解。 瀏覽器同源策略 n...
摘要:上節(jié)我們講了同源策略,這節(jié)我們講講如何跨域。當(dāng)這些從的腳本執(zhí)行出錯(cuò),因?yàn)檫`背了同源策略為了保證用戶信息不被泄露,錯(cuò)誤信息不會(huì)顯示出來(lái),取而代之只會(huì)返回一個(gè)。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門(mén)技術(shù)就算入門(mén),但也僅僅是入門(mén),現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的中心思想,我們開(kāi)課啦(每...
閱讀 1459·2021-10-08 10:04
閱讀 2797·2021-09-22 15:23
閱讀 2779·2021-09-04 16:40
閱讀 1234·2019-08-29 17:29
閱讀 1560·2019-08-29 17:28
閱讀 3044·2019-08-29 14:02
閱讀 2287·2019-08-29 13:18
閱讀 934·2019-08-23 18:35