跨資源共享CORS

名詞解釋

  • Origin:同源策略指的是具有相同協(xié)議/域以及端口的資源;
  • CORS:跨資源共享,Cross-Origin Resource Sharing;

跨域請(qǐng)求方案

  • CORS:官方推薦的方案;
  • HTML5 API:postMessage;
  • Web Socket:完全拋棄HTTP協(xié)議;
  • JSONP:不推薦使用;

CORS

跨資源共享允許Web服務(wù)器進(jìn)行跨源訪問(wèn)控制,以保障跨源數(shù)據(jù)的安全。

使用CORS的場(chǎng)景

  • 使用XHR或者FetchAPI發(fā)起的HTTP請(qǐng)求;
  • Web字體,調(diào)用@font-face字體使用到外部字體資源;
  • 使用drawImage將Image/Video畫(huà)面繪制到canvas;
  • WebGL貼圖;

CORS預(yù)檢請(qǐng)求

  • 預(yù)檢目的:避免跨域請(qǐng)求對(duì)服務(wù)器用戶(hù)數(shù)據(jù)產(chǎn)生預(yù)料之外的影響;
  • 實(shí)現(xiàn)方法:向服務(wù)器發(fā)送OPTIONS請(qǐng)求;

HTTP請(qǐng)求頭部字段

  • Origin:預(yù)檢請(qǐng)求或者實(shí)際請(qǐng)求的源站;
  • Access-Control-Request-Method:預(yù)檢請(qǐng)求中將實(shí)際請(qǐng)求的方法告訴服務(wù)器;
  • Access-Control-Request-Headers:預(yù)檢請(qǐng)求中將實(shí)際請(qǐng)求的頭部告訴服務(wù)器;
OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

HTTP響應(yīng)的頭部

  • Access-Control-Allow-Origin:允許的源,不管預(yù)檢請(qǐng)求還是實(shí)際請(qǐng)求都需要此字段;
  • Access-Control-Allow-Methods:允許的方法;
  • Access-Control-Allow-Headers:允許的頭部;
  • Access-Control-Expose-Headers:服務(wù)器把允許瀏覽器訪問(wèn)的頭放入白名單;
  • Access-Control-Max-Age:該響應(yīng)的有效時(shí)間,在該時(shí)間內(nèi)無(wú)需再發(fā)預(yù)檢請(qǐng)求;
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
Vary: Accept-Encoding, Origin
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain

簡(jiǎn)單請(qǐng)求

不需要發(fā)起預(yù)檢的請(qǐng)求被稱(chēng)為簡(jiǎn)單請(qǐng)求。

簡(jiǎn)單請(qǐng)求必需滿(mǎn)足下面所有條件

  • 請(qǐng)求方法必需三者之一:GET, POST, HEAD;
  • Content-Type必需是三者一直:text/plain, multipart/form-data, application/x-www-form-urlencoded;
  • 頭部相關(guān):Accept, Accept-Language, Content-Type等;
  • 文件相關(guān):XMLHttpRequestUpload對(duì)象不能注冊(cè)監(jiān)聽(tīng)器以及沒(méi)有ReadableStream對(duì)象;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容