官术网_书友最值得收藏!

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)了跨域資源的請求訪問。

主站蜘蛛池模板: 堆龙德庆县| 潼关县| 陕西省| 通许县| 平利县| 金山区| 射阳县| 安康市| 旬邑县| 镇雄县| 泽库县| 高青县| 仁怀市| 岳普湖县| 宁蒗| 苏州市| 孟州市| 江西省| 泰州市| 炎陵县| 鄂伦春自治旗| 黔西县| 泾源县| 陵水| 深州市| 夏河县| 彰化市| 文成县| 方山县| 永宁县| 蓝田县| 平山县| 阳西县| 大厂| 南京市| 莒南县| 黄梅县| 怀柔区| 勃利县| 兰州市| 海南省|