本篇內(nèi)容介紹了“CORS實(shí)現(xiàn)模型有哪些”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司專業(yè)成都做網(wǎng)站、網(wǎng)站建設(shè),集網(wǎng)站策劃、網(wǎng)站設(shè)計、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營銷、軟文推廣等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計,讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計制作為您帶來效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
CORS 實(shí)現(xiàn)兩種模型
1.1
簡單模型
支持 get/post/put/delete 請求,例如返回 Access-Control-Allow-Origin:*,但是不允許自定義 header 且會忽略 cookies,且 post 數(shù)據(jù)格式有限制,只支持 ‘text/plain', 'application/x-www-urlencoded'and'multipart/form-data',其中’text/plain'默認(rèn)支持,后面兩種需要下面的預(yù)檢請求和服務(wù)器協(xié)商。
1.2
協(xié)商模型/預(yù)檢請求(Preflighted Request)
舉例:瀏覽器發(fā)出 PUT 請求,OPTION 請求返回 Access-Control-Allow-Origin: 允許瀏覽器的腳本執(zhí)行服務(wù)器返回的數(shù)據(jù)。
跨域資源共享標(biāo)準(zhǔn)新增了一組 HTTP 首部字段,允許服務(wù)器聲明哪些源站通過瀏覽器有權(quán)限訪問哪些資源。另外,規(guī)范要求,對那些可能對服務(wù)器數(shù)據(jù)產(chǎn)生副作用的 HTTP 請求方法(特別是 GET 以外的 HTTP 請求,或者搭配某些 MIME 類型的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發(fā)起一個預(yù)檢請求(preflight request),從而獲知服務(wù)端是否允許該跨域請求。服務(wù)器確認(rèn)允許之后,才發(fā)起實(shí)際的 HTTP 請求。在預(yù)檢請求的返回中,服務(wù)器端也可以通知客戶端,是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認(rèn)證相關(guān)數(shù)據(jù))。
2
FastAPI 利用 CORSMiddleware 中間件來實(shí)現(xiàn) CORS。
2.1
使用 CORSMiddleware
我們通過以下流程在 FastAPI 應(yīng)用中使用 CORSMiddleware
1、導(dǎo)入 CORSMiddleware
2、創(chuàng)建允許的 origins 列表
3、在應(yīng)用中引入 CORSMiddleware 中間件
4、鑒權(quán)信息(Authorization headers, Cookies 等)
5、支持的 HTTP 方法(POST,GET,或者所有"")
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://127.0.0.1",
"https://www.baidu.com",
"https://www.hao123.com",
"http://localhost:8080",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def main():
return {"message": "Hello World,"}
2.2
CORSMiddleware 解析
CORSMiddleware 的參數(shù)默認(rèn)值是受限制的,為了在跨域訪問中支持相應(yīng)的功能,我們應(yīng)當(dāng)顯示指定具體參數(shù)的的信息。CORSMiddleware 支持參數(shù)信息如下:
1、allow_origins:允許跨域請求的域名列表,例如 ['https://example.org ', 'https://www.example.org'] 或者 ['']
2、allow_origin_regex:允許允許跨域請求的域名正則表達(dá)式,例如 'https://..example.org'
3、allow_methods:允許跨域請求的 HTTP 方法列表,默認(rèn)為['GET'],[''] 表示允許所有 HTTP 方法
4、allow_headers:跨域請求支持的 HTTP 頭信息列表。['']表示允許所有頭信息。Accept, Accept-Language, Content-Language 和 Content-Type 頭信息默認(rèn)全都支持
5、allow_credentials:表示在跨域請求時是否支持 cookie,默認(rèn)為 False
6、expose_headers:表示對瀏覽器可見的返回結(jié)果頭信息,默認(rèn)為[]
7、max_age:瀏覽器緩存 CORS 返回結(jié)果的最大時長,默認(rèn)為 600 (單位秒)
3
請求種類
瀏覽器將 CORS 請求分成兩類:簡單請求(Simple requests)和非簡單請求,也叫預(yù)檢請求(CORS preflight requests)。
3.1
簡單請求與非簡單請求界定
只要同時滿足以下兩大條件,就屬于簡單請求。
1.請求方法是以下三種方法之一:HEAD、GET 、POST
2.HTTP 的頭信息不超出以下幾種字段:Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三個值 application/x-www-form-urlencoded、multipart/form-data、text/plain 凡是不同時滿足上面兩個條件,就屬于非簡單請求。
3.2
瀏覽區(qū)處理兩種請求的區(qū)別
1、簡單請求對于簡單請求,瀏覽器直接發(fā)出 CORS 請求。具體來說,就是在頭信息之中,增加一個 Origin 字段。Origin 字段用來說明,本次請求來自哪個源(協(xié)議 + 域名 + 端口)。服務(wù)器根據(jù)這個值,決定是否同意這次請求。在這種情況下,中間件會正常傳遞請求信息,但會在返回結(jié)果中包含恰當(dāng)?shù)?CORS 頭信息。
2、預(yù)檢請求非簡單請求是那種對服務(wù)器有特殊要求的請求,比如請求方法是 PUT 或DELETE ,或者 Content-Type 字段的類型是 application/json。
非簡單請求的 CORS 請求,會在正式通信之前,增加一次 HTTP 查詢請求,稱為"預(yù)檢"請求(preflight)。
瀏覽器先詢問服務(wù)器,當(dāng)前網(wǎng)頁所在的域名是否在服務(wù)器的許可名單之中,以及可以使用哪些 HTTP 方法和頭信息字段。只有得到肯定答復(fù),瀏覽器才會發(fā)出正式的請求,否則就報錯。
"預(yù)檢"請求用的請求方法是 OPTIONS,表示這個請求是用來詢問的。頭信息里面,關(guān)鍵字段是 Origin,表示請求來自哪個源。
除了 Origin 字段,"預(yù)檢"請求的頭信息包括兩個特殊字段。
1.Access-Control-Request-Method 該字段是必須的,用來列出瀏覽器的 CORS 請求會用到哪些 HTTP 方法,上例是 PUT 。
2.Access-Control-Request-Headers 該字段是一個逗號分隔的字符串,指定瀏覽器 CORS 請求會額外發(fā)送的頭信息字段,上例是 X-Custom-Header。服務(wù)器收到"預(yù)檢"請求以后,檢查了 Origin、Access-Control-Request-Method 和 Access-Control-Request-Headers 字段以后,確認(rèn)是否允許跨源請求,就可以做出回應(yīng)。
在這種情況下,中間件會攔截請求信息并且根據(jù)是否允許跨域請求返回不同的請求結(jié)果信息。
4
與 JSONP 的比較
CORS 與 JSONP 的使用目的相同,但是比 JSONP 更強(qiáng)大。JSONP 只支持 GET 請求,CORS 支持所有類型的 HTTP 請求。JSONP 的優(yōu)勢在于支持老式瀏覽器,以及可以向不支持 CORS 的網(wǎng)站請求數(shù)據(jù)。
5
CORS 總結(jié):
1.給出 CORS 的定義
2.在 fastapi 中如何使用 CORSMiddleware 中間件實(shí)現(xiàn) CORS
3.給出 CORS 與 JSONP 的比較
“CORS實(shí)現(xiàn)模型有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!