摘要:對于簡單請求,基本就是在請求中自動在頭信息中添加一個字段,例如這表示同意的請求。非簡單請求會在正式通信前增加一次查詢請求,成為預檢。必要字段表示服務器支持的所有跨域請求方法,只要瀏覽器使用的請求方法包含在內(nèi)即可通過。
關(guān)于http請求的一些理解:
CORS是一個w3c標準,全稱為Cross-origin resoursce sharing(跨域資源共享),它允許瀏覽器向不用源的服務器發(fā)起XMLHttpRequest請求,從而可以略過ajax同源策略的限制。
簡單請求:
只要滿足請求方法是HEAD、GET、POST;HTTP頭信息不超出以下字段Accept Accept-Language Content-Language Last-Event-ID Content-Type: application/x-www-form-urlencode multipart-data text/plain 就屬于簡單請求。
對于簡單請求,基本就是在請求中自動在頭信息中添加一個origin字段,例如Origin: http://localhost:8000,這表示同意locahost:8000的請求。如果origin指定的源不在許可范圍內(nèi),服務器會返回一個正常的HTTP回應,如果瀏覽器沒有發(fā)現(xiàn)Resonse Headers響應頭信息沒有包含Access-Control-Allow-Origin就會拋出錯誤,但這種錯誤無法通過status code來識別,因為返回的狀態(tài)碼可能是200.
如果你使用的域名是origin允許的,Response Headers里會多出幾個基本頭信息字段:
Access-Control-Allow-Credential: true, Access-Control-Allow-Headers:origin, content-type, accept, x-request-with, Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, Access-Control-Allow-Origin: http:localhost:8000
Access-Control-Allow-Credential: 表示是否允許發(fā)送cookies。默認情況下,Cookies不包括在CORS請求中;設(shè)為true表示cookies可以包含在請求中一起發(fā)給服務器,如果不需要發(fā)送cookies給服務器,需刪除字段。需要注意的是:除了設(shè)置Access-Control-Allow-Credential:true外,在ajax請求中也必須打開withCredentials,方法如下:
var xhr = new XMLHttpRequest(); xhr.withCredentials = true;
否則就算服務器同意發(fā)送或設(shè)置cookie,瀏覽器也不會發(fā)送或處理。如果不想發(fā)送cookie,最保險的方法就是:
xhr.withCredentials = false;
Access-Control-origin: 必填項,要么是origin指定的被允許的值,要么是*,表示接受任意域名的請求。
非簡單請求:
非簡單請求是那種對服務器有特殊要求的請求,比如PUT DELETE,或者Content-Type:application/json等。非簡單請求會在正式通信前增加一次HTTP查詢請求,成為flight(預檢)。瀏覽器先詢問服務器,當前請求域是否在服務器許可名單中,以及可以使用哪些HTTP動詞頭信息字段,如果返回true瀏覽器會發(fā)出XMLHTTPRequest請求否則會報錯。下面是一個例子:
var url = "http://localhost:8000"; var xhr = new XMLHttpRequest(); xhr.open("DELETE", url, true); xhr.setRequestHeader("x-request-with", "value"); xhr.send();
這里,HTTP請求中,方法是DELETE,并發(fā)送了一個頭信息為x-request-with,瀏覽器發(fā)現(xiàn),這是一個非簡單請求,就會自動預檢,要求服務器預檢這個HTTP頭信息。
預檢請求用的方法是OPTIONS,表示這個請求是用來詢問的。頭信息里面,關(guān)鍵字段是origin,表示來源于哪個源。除了origin,預檢還包括Method Headers,分別為:
Access-control-request-origin: *, Access-Control-Request-Method: DELETE, Access-Control-request-Headers: x-request-with,
瀏覽器收到flight預檢以后檢查了origin Access-Control-Request-Method 和 Access-Control-Request-Headers字段后確認允許跨域請求,就可以作出回應。如果flight預檢沒有通過,也會返回一個正常的HTTP回應。但如果沒有任何CORS相關(guān)的Response Headers,flight預檢就不會通過,控制臺會打印出關(guān)鍵信息:
...http://localhost:8000 is not allowed by Access-Allow-Origin
服務器回應的其他CORS相關(guān)字段如下。
Access-Control-Allow-credentials: true Access-Control-Allow-Methods:GET, POST, DELETE,OPTIONS Access-Control-Allow-Headers:origin, content-type, accept, x-request-with, Authorization Access-Control-Allow-Max-Age:1728000
Access-Control-Allow-Methods 必要字段 表示服務器支持的所有跨域請求方法,只要瀏覽器使用的請求方法包含在內(nèi)即可通過。
Access-Control-Allow-Headers 必要字段 表明服務器支持的所有頭信息字段,也是為了避免多次預檢請求。
Access-Control-Allow-Max-Age 可選字段 單位是s,用來指定本次預檢的有效期,即在給定時間內(nèi)允許該條緩存回應,不會發(fā)出一條預檢請求。
如果服務器通過了預檢請求,以后瀏覽器正常的跨域請求就和簡單請求一樣,會有一個origin有信息段,副武器的回應也都會有一個Access-Control-Allow-Origin 的頭信息段,返回請求如下:
Access-Control-Allow-Origin:http:localhost:8000 Content-Type: text/html; charset=utf-8
其中origin信息是必然會出現(xiàn)的。
Cors與JSONP的比較
CORS比JSONP更強大,JSONP只支持GET請求,CORS支持所有類型的HTTP請求,但JSONP對于老瀏覽器支持較好。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100526.html
摘要:整個請求響應鏈的緩存機制必須遵循的特別指令?;镜木彺鏅C制就是由這些參數(shù)形成的。如果此文章中有什么問題的話,煩請一定要指出,謝謝參考資料緩存機制淺析移動端加載性能優(yōu)化淺談瀏覽器的緩存機制 之前對http的緩存知識一知半解,只能說出個大概。和同事交流這塊內(nèi)容時稍一深入探討就捉襟見肘,自慚形穢。故痛定思痛,花了一兩天時間去研究了下這塊內(nèi)容,寫下這篇筆記方便以后的查詢與修正。 首先介紹下和緩...
摘要:上一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)部署相關(guān)庫的安裝下一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)網(wǎng)頁基礎(chǔ)在寫爬蟲之前,還是需要了解一些爬蟲的基礎(chǔ)知識,如原理網(wǎng)頁的基礎(chǔ)知識爬蟲的基本原理基本原理等。由萬維網(wǎng)協(xié)會和工作小組共同合作制定的規(guī)范,目前廣泛使用的是版本。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---14、部署相關(guān)庫的安裝:Scrapyrt、Gerapy下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---16、Web網(wǎng)頁基礎(chǔ)...
摘要:常見狀態(tài)碼號碼含義表示服務器成功接收部分請求,要求客戶端繼續(xù)提交其余請求才能完成整個處理過程表示服務器成功接收請求并已完成整個處理過程。 創(chuàng)建時間:2021-11-24作者:在下小黃一、小試牛刀:1.1 怎樣扒網(wǎng)頁呢?其實就是根據(jù)URL來獲取它的網(wǎng)頁信息,雖然我們在瀏覽器中看到的是一幅幅優(yōu)美的畫面,但是其實是由...
摘要:支持請求響應攔截器。定位與目標的定位是成為請求的終極解決方案。攔截器支持請求響應攔截器,可以通過它在請求發(fā)起之前和收到響應數(shù)據(jù)之后做一些預處理。 Fly.js 是一個功能強大的輕量級的javascript http請求庫,同時支持瀏覽器和node環(huán)境,通過適配器,它可以運行在任何具有網(wǎng)絡(luò)能力的javascript運行環(huán)境;同時fly.js有一些高級的玩法如全局ajax攔截、在web a...
摘要:并不是所有爬蟲都遵守,一般只有大型搜索引擎爬蟲才會遵守。的端口號為的端口號為工作原理網(wǎng)絡(luò)爬蟲抓取過程可以理解為模擬瀏覽器操作的過程。表示服務器成功接收請求并已完成整個處理過程。 爬蟲概念 數(shù)據(jù)獲取的方式: 企業(yè)生產(chǎn)的用戶數(shù)據(jù):大型互聯(lián)網(wǎng)公司有海量用戶,所以他們積累數(shù)據(jù)有天然優(yōu)勢。有數(shù)據(jù)意識的中小型企業(yè),也開始積累的數(shù)據(jù)。 數(shù)據(jù)管理咨詢公司 政府/機構(gòu)提供的公開數(shù)據(jù) 第三方數(shù)據(jù)平臺購買...
閱讀 2975·2023-04-25 17:46
閱讀 3601·2021-11-25 09:43
閱讀 1103·2021-11-18 10:02
閱讀 3064·2021-10-14 09:43
閱讀 2785·2021-10-13 09:40
閱讀 1535·2021-09-28 09:35
閱讀 2197·2019-08-30 15:52
閱讀 3166·2019-08-30 14:06