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