- Spring Boot+Spring Cloud+Vue+Element項(xiàng)目實(shí)戰(zhàn):手把手教你開發(fā)權(quán)限管理系統(tǒng)
- 徐麗健
- 686字
- 2019-11-22 18:33:02
9.2 CORS 技術(shù)
為了解決瀏覽器跨域問題,W3C提出了跨源資源共享方案,即CORS(Cross-Origin Resource Sharing)。
CORS可以在不破壞即有規(guī)則的情況下,通過后端服務(wù)器實(shí)現(xiàn)CORS接口,從而實(shí)現(xiàn)跨域通信。CORS將請求分為兩類:簡單請求和非簡單請求,分別對跨域通信提供了支持。
9.2.1 簡單請求
在CORS出現(xiàn)前,發(fā)送HTTP請求時在頭信息中不能包含任何自定義字段,且HTTP信息不超過以下幾個字段:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type(僅限于[application/x-www-form-urlencoded、multipart/form-data、text/plain]類型)
一個簡單請求的例子:

對于簡單請求,CORS的策略是請求時在請求頭中增加一個Origin字段,服務(wù)器收到請求后,根據(jù)該字段判斷是否允許該請求訪問。
- 如果允許,就在HTTP頭信息中添加Access-Control-Allow-Origin字段,并返回正確的結(jié)果。
- 如果不允許,就不在HTTP頭信息中添加Access-Control-Allow-Origin字段。
除了上面提到的Access-Control-Allow-Origin,還有幾個字段用于描述CORS返回結(jié)果:
- Access-Control-Allow-Credentials:可選,用戶是否可以發(fā)送、處理cookie。
- Access-Control-Expose-Headers:可選,可以讓用戶拿到的字段。有幾個字段無論設(shè)置與否都可以拿到的,包括Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
9.2.2 非簡單請求
對于非簡單請求的跨源請求,瀏覽器會在真實(shí)請求發(fā)出前增加一次OPTION請求,稱為預(yù)檢請求(preflight request)。預(yù)檢請求將真實(shí)請求的信息,包括請求方法、自定義頭字段、源信息添加到HTTP頭信息字段中,詢問服務(wù)器是否允許這樣的操作。
例如一個GET請求:

與CORS相關(guān)的字段有:
- 請求使用的HTTP方法Access-Control-Request-Method。
- 請求中包含的自定義頭字段Access-Control-Request-Headers。
服務(wù)器收到請求時,需要分別對Origin、Access-Control-Request-Method、Access-Control-Request-Headers進(jìn)行驗(yàn)證,驗(yàn)證通過后,會在返回HTTP頭信息中添加:

它們的含義分別是:
- Access-Control-Allow-Methods:真實(shí)請求允許的方法。
- Access-Control-Allow-Headers:服務(wù)器允許使用的字段。
- Access-Control-Allow-Credentials:是否允許用戶發(fā)送、處理cookie。
- Access-Control-Max-Age:預(yù)檢請求的有效期,單位為秒。有效期內(nèi),不會重復(fù)發(fā)送預(yù)檢請求。
當(dāng)預(yù)檢請求通過后,瀏覽器才會發(fā)送真實(shí)請求到服務(wù)器。這樣就實(shí)現(xiàn)了跨域資源的請求訪問。
- The Modern C++ Challenge
- Java異步編程實(shí)戰(zhàn)
- Apache Spark 2.x Machine Learning Cookbook
- 網(wǎng)絡(luò)爬蟲原理與實(shí)踐:基于C#語言
- Linux命令行與shell腳本編程大全(第4版)
- jQuery開發(fā)基礎(chǔ)教程
- Learning SciPy for Numerical and Scientific Computing(Second Edition)
- C/C++程序員面試指南
- 從零開始:UI圖標(biāo)設(shè)計(jì)與制作(第3版)
- FPGA嵌入式項(xiàng)目開發(fā)實(shí)戰(zhàn)
- Python計(jì)算機(jī)視覺和自然語言處理
- Mastering Concurrency in Python
- Mastering Linux Kernel Development
- 數(shù)據(jù)庫基礎(chǔ)與應(yīng)用實(shí)驗(yàn)教程:Visual FoxPro 6.0
- 軟件工程實(shí)用教程 (第3版)