摘要:發(fā)布自的博客,歡迎大家轉(zhuǎn)載,但是要注意注明出處。另外,該文章收納在的個(gè)人的知識(shí)整理倉(cāng)庫(kù),歡迎投稿跨域簡(jiǎn)介常用跨域方法跨域簡(jiǎn)介所謂跨域指的是請(qǐng)求從其他的域獲取數(shù)據(jù)或者傳輸數(shù)據(jù)所謂域同源,指的是兩個(gè)服務(wù)器資源的根的域名端口協(xié)議三者完全相同,只要
發(fā)布自Kindem的博客,歡迎大家轉(zhuǎn)載,但是要注意注明出處。另外,該文章收納在Kindem的個(gè)人的 IT 知識(shí)整理倉(cāng)庫(kù),歡迎 Star、Fork、投稿
Ajax跨域簡(jiǎn)介
常用跨域方法
CORS
JSONP
Ajax跨域簡(jiǎn)介所謂Ajax跨域指的是Ajax請(qǐng)求從其他的域獲取數(shù)據(jù)或者傳輸數(shù)據(jù)
所謂域同源,指的是兩個(gè)服務(wù)器資源的根url的域名、端口、協(xié)議三者完全相同,只要三者中任何一個(gè)不同,則說(shuō)明產(chǎn)生了跨域
給一個(gè)例子,對(duì)于第一個(gè)服務(wù)器資源,其他一些url的同源情況如下:
http://www.test.com/index.html http://www.test.com/index.js 同源 http://www.test.com/login/login.js 同源 https://www.test.com/index.html 跨域(協(xié)議) http://www.a.com/index.html 跨域(域名) http://a.com/index.html 跨域(不同子域) http://www.test.com:8080/index.html 跨域(端口)常用跨域方法 CORS
CORS是一個(gè)W3C標(biāo)準(zhǔn),其全稱為Cross-Origin Resource Sharing,即跨域資源共享。它允許瀏覽器向跨域服務(wù)器發(fā)送XMLHttpRequest請(qǐng)求,從而克服了Ajax只能同源使用的限制
CORS需要瀏覽器和服務(wù)器同時(shí)支持,目前主流瀏覽器都支持這個(gè)標(biāo)準(zhǔn)(IE>=10),所以CORS的關(guān)鍵主要在于服務(wù)器,要支持這個(gè)功能,往往開發(fā)者需要在服務(wù)器端進(jìn)行額外設(shè)置
另外,CORS標(biāo)準(zhǔn)對(duì)用戶來(lái)說(shuō)是透明的,用戶感知不到CORS的存在,一切都是瀏覽器自動(dòng)完成。當(dāng)瀏覽器檢測(cè)到跨域的Ajax請(qǐng)求時(shí),就會(huì)自動(dòng)做出一些處理,使得請(qǐng)求能夠跨域
跨域的Ajax請(qǐng)求分為兩種:
簡(jiǎn)單請(qǐng)求:
請(qǐng)求方法為HEAD、POST、GET之一
HTTP頭字段只有Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type中的一種或多種
HTTP頭字段中的Content-Type字段的取值為application/x-www-form-urlencoded、multipart/form-data、text/plain之一
非簡(jiǎn)單請(qǐng)求: 所有不滿足上述規(guī)則的請(qǐng)求
CORS對(duì)于兩種不同的請(qǐng)求的處理是不同的
對(duì)于簡(jiǎn)單請(qǐng)求,一個(gè)跨域Ajax請(qǐng)求的處理流程如下:
瀏覽器自動(dòng)在本次請(qǐng)求的HTTP頭中添加Origin字段,表示這次請(qǐng)求來(lái)自的域
服務(wù)器根據(jù)Origin字段判斷這一次請(qǐng)求是否在許可范圍內(nèi):
如果不在,返回一個(gè)正常的HTTP響應(yīng),只不過(guò)響應(yīng)的HTTP頭中沒有Access-Control-Allow-Origin字段,瀏覽器將認(rèn)為這一次跨域Ajax沒能成功
如果在,服務(wù)器會(huì)在響應(yīng)HTTP頭中添加這幾個(gè)字段
Access-Control-Allow-Origin: 這個(gè)字段標(biāo)識(shí)服務(wù)器認(rèn)同的Origin,這個(gè)Origin為*時(shí)標(biāo)識(shí)服務(wù)器認(rèn)同所有源。只有請(qǐng)求的HTTP頭的Origin與該字段同源時(shí),瀏覽器才會(huì)認(rèn)為這一次跨域Ajax請(qǐng)求成功了
Access-Control-Allow-Credentials: 這個(gè)字段標(biāo)識(shí)服務(wù)器允許Cookie,如果設(shè)置為true則標(biāo)識(shí)允許,默認(rèn)為不允許
Access-Control-Expose-Headers: 允許XMLHttpRequest獲取的額外字段名
對(duì)于非簡(jiǎn)單請(qǐng)求,一個(gè)跨域Ajax請(qǐng)求的處理流程如下:
瀏覽器在發(fā)送正式的Ajax請(qǐng)求之前,會(huì)提前發(fā)送一次OPTIONS請(qǐng)求,頭信息中有:
Origin: 請(qǐng)求的源
Access-Control-Request-Method: 瀏覽器會(huì)用的的HTTP方法
Access-Control-Request-Headers: 瀏覽器會(huì)額外發(fā)送的頭信息字段
收到這個(gè)請(qǐng)求之后,服務(wù)器將會(huì)返回一些控制信息,最重要的仍然是上面說(shuō)到的判定是否允許跨域的Access-Control-Allow-Origin
如果服務(wù)器返回了一個(gè)正常的HTTP響應(yīng),則瀏覽器會(huì)認(rèn)為OPTIONS請(qǐng)求成功,接下來(lái)則會(huì)進(jìn)行真正的的請(qǐng)求
服務(wù)器正常處理真正的請(qǐng)求,并且在返回的HTTP響應(yīng)中也帶上Access-Control-Allow-Origin,瀏覽器會(huì)再一次校驗(yàn)這一字段
可見CORS標(biāo)準(zhǔn)本身并不復(fù)雜,其核心是服務(wù)器和瀏覽器驗(yàn)證域是否被允許
JSONPJSONP的全稱為JSON with Padding,是JSON數(shù)據(jù)的一種使用模式,JSONP同樣是為了支持跨域Ajax請(qǐng)求而生的,但是它相對(duì)CORS來(lái)說(shuō)對(duì)古老的瀏覽器兼容性較好,也更加簡(jiǎn)單。
JSONP的原理是JavaScript注入,在html中使用標(biāo)簽引入JavaScript腳本是不會(huì)受到同源限制的,這意味著可以通過(guò)標(biāo)簽引入來(lái)自跨域的腳本,像這樣:
// origin: http://www.test.com
想象一下如果引入的腳本是這樣的:
dealData({ username: "kindem", age: 15, // ... });
不是就相當(dāng)于從服務(wù)器拿到一段數(shù)據(jù)并且進(jìn)行處理了嗎?
接下來(lái)可以設(shè)想一下,假設(shè)服務(wù)器對(duì)于src指向的url的處理并不是返回一個(gè)靜態(tài)文件,而是動(dòng)態(tài)地組合出一段文本,這段文本一上面給的形式返回,里面的參數(shù)由服務(wù)器動(dòng)態(tài)生成,而調(diào)用的函數(shù)則是前端約定好的函數(shù),則相當(dāng)于變相地返回了一段跨域的數(shù)據(jù),這就是JSONP的核心思想
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97211.html
摘要:關(guān)于,強(qiáng)烈推薦閱讀跨域資源共享詳解阮一峰另外,這里也整理了一個(gè)實(shí)現(xiàn)原理圖簡(jiǎn)化版如何判斷是否是簡(jiǎn)單請(qǐng)求瀏覽器將請(qǐng)求分成兩類簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求。 前言 從剛接觸前端開發(fā)起,跨域這個(gè)詞就一直以很高的頻率在身邊重復(fù)出現(xiàn),一直到現(xiàn)在,已經(jīng)調(diào)試過(guò)N個(gè)跨域相關(guān)的問(wèn)題了,16年時(shí)也整理過(guò)一篇相關(guān)文章,但是感覺還是差了點(diǎn)什么,于是現(xiàn)在重新梳理了一下。 個(gè)人見識(shí)有限,如有差錯(cuò),請(qǐng)多多見諒,歡迎提出iss...
摘要:瀏覽器的同源策略固然保障了互聯(lián)網(wǎng)世界的數(shù)據(jù)隱私與數(shù)據(jù)安全,但是如果當(dāng)我們需要使用跨域請(qǐng)求資源時(shí),同源策略又會(huì)成為開發(fā)者的阻礙。我們之前提到過(guò),如果想要繞過(guò)瀏覽器同源策略,實(shí)現(xiàn)使用技術(shù)跨域獲取資源,需要服務(wù)端和客戶端的協(xié)同合作。 瀏覽器的同源策略固然保障了互聯(lián)網(wǎng)世界的數(shù)據(jù)隱私與數(shù)據(jù)安全,但是如果當(dāng)我們需要使用AJAX跨域請(qǐng)求資源時(shí),同源策略又會(huì)成為開發(fā)者的阻礙。在本文中,我們會(huì)簡(jiǎn)單介紹需...
摘要:在接觸前端開發(fā)起,跨域這個(gè)詞就一直以很高的頻率在我們學(xué)習(xí)工作中重復(fù)出現(xiàn),最近在工作中遇到了跨域的相關(guān)問(wèn)題,這里我把它總結(jié)記錄一下。 在接觸前端開發(fā)起,跨域這個(gè)詞就一直以很高的頻率在我們學(xué)習(xí)工作中重復(fù)出現(xiàn),最近在工作中遇到了跨域的相關(guān)問(wèn)題,這里我把它總結(jié)記錄一下。關(guān)于跨域,有N種類型,現(xiàn)在我只專注于ajax請(qǐng)求跨域(ajax跨域只是屬于瀏覽器同源策略中的一部分,其它的這里不做介紹),內(nèi)容...
摘要:時(shí)間年月日星期三說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。當(dāng)預(yù)檢請(qǐng)求通過(guò)的時(shí)候,才發(fā)送真正的請(qǐng)求。 時(shí)間:2018年04月18日星期三說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介...
閱讀 2612·2021-09-26 10:13
閱讀 6078·2021-09-08 10:46
閱讀 710·2019-08-30 15:53
閱讀 2989·2019-08-29 16:13
閱讀 2785·2019-08-26 12:23
閱讀 3512·2019-08-26 11:24
閱讀 1127·2019-08-23 18:09
閱讀 1052·2019-08-23 17:08