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