1. 程式人生 > 其它 >CORS跨域資源共享 詳解

CORS跨域資源共享 詳解

1. CORS:全稱 Cross-Origin Resource Sharing,它允許瀏覽器向跨域伺服器傳送 XMLHttpRequest 請求,克服了 Ajax 只能同源請求的限制.【在這裡可能你會見到跨域或跨源兩種說法,兩者並無區別】

2. CORS簡介: 需要瀏覽器和伺服器同時支援,CORS 的通訊過程,全程由瀏覽器實現,不需要我們去進行任何操作,因此對於開發者來說,我們學習 CORS 只是為了弄清楚其原理,而非應用於實踐工程。當我們希望傳送跨域請求時,程式碼和同源 Ajax 請求的程式碼完全一致。瀏覽器會在你傳送跨域資源請求時,自動為請求頭部新增一些資訊,當進行非簡單請求【下面會介紹】時,還會額外發送一次預檢請求. 因此我們瞭解到,當我們傳送跨域請求,瀏覽器幫我們做了該做的事情,關鍵是伺服器是否允許我們跨域請求,只要伺服器實現了 CORS 介面,我們就可以實現跨域請求.

簡單複習一下:什麼是跨域請求?當你希望請求的頁面的 協議、域名以及埠號 有任何一個和你傳送請求所在的頁面的 協議、域名以及埠號 對應不上時,就是跨域請求.

3. 跨域請求被分為兩類:

【1】簡單請求:需要滿足兩大條件:(1)請求方法屬於以下三種之一:GET、POST、HEAD

(2)HTTP 的頭資訊不超出以下欄位:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type:只限於三個值application/x-www-form-urlencodedmultipart/form-datatext/plain

【2】非簡單請求:不滿足簡單請求條件的即為非簡單請求.

4. 簡單請求詳解:

【1】對於簡單請求,瀏覽器直接傳送 CORS 請求,在頭資訊中新增一個 Origin 欄位,如下例【轉自 阮一峰 部落格,僅作為個人學習使用】

GET /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

Origin 欄位用於說明發送請求所在頁面的源(協議 + 域名 + 埠號),伺服器會檢查這個源資訊,決定是否同意這次請求。

舉個例子來說就是:比如你去訪問百度,百度會收到你的源資訊,如果你的源符合要求,那百度就允許你訪問,如果你的源資訊不合法或者有危險,那麼百度就不允許你訪問。

(1)如果說 Origin 指定的源不在許可範圍內,也就是說伺服器不允許此次跨域請求,那麼伺服器會返回一個正常的 HTTP 迴應,這個迴應的頭資訊不包括 Access-Control-Allow-Origin 欄位,瀏覽器找不到這個欄位就會報錯通過 XMLHttpRequest 物件的 onerror 回撥函式捕獲,注意這種錯誤無法被狀態碼識別,因為可能返回 200 狀態碼.

(2)如果說 Origin 指定的源在許可範圍內,那麼返回的 HTTP 響應會多出幾個頭資訊欄位:

※ 1.Access-Control-Allow-Origin:該欄位是必須的,它的值要麼是請求時 Origin 的值,要麼是星號 * ,代表允許所有源請求.

※ 2.Access-Control-Allow-Credentials:欄位可選,表示是否允許傳送 Cookie,預設情況,Cookie 不包括在 CORS 請求,設為 true,則表示允許攜帶 Cookie 請求.