摘要:只限于三個值表單在歷史上一直可以跨域發出請求。如果指定的域名在許可范圍內,服務器返回的響應,會多出幾個頭信息字段。預檢請求用的請求方法是,表示這個請求是用來詢問的。上面頭信息中,字段是每次回應都必定包含的。
全稱是“跨域資源共享”(Cross-origin resource sharing)。它允許瀏覽器向跨域的服務器,發出XMLHttpRequest請求,從而克服了 AJAX 只能同源使用的限制。
簡介瀏覽器一旦發現 AJAX 請求跨域,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求
實現 CORS 通信的關鍵是服務器。只要服務器實現了 CORS 接口,就可以跨域通信。
兩種請求只要同時滿足以下兩大條件,就屬于簡單請求。
(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
表單在歷史上一直可以跨域發出請求。簡單請求就是表單請求,瀏覽器沿襲了傳統的處理方式,不把行為復雜化,否則開發者可能轉而使用表單,規避 CORS 的限制。對于非簡單請求,瀏覽器會采用新的處理方式。
簡單請求對于簡單請求,瀏覽器直接發出 CORS 請求。具體來說,就是在頭信息之中,增加一個Origin字段
服務器會返回Access-Control-Allow-Origin字段
如果origin不在許可范圍內,不包含acao,就知道出錯了,從而拋出一個錯誤,被XMLHttpRequest的onerror回調函數捕獲。注意,這種錯誤無法通過狀態碼識別,因為 HTTP 回應的狀態碼有可能是200。
如果Origin指定的域名在許可范圍內,服務器返回的響應,會多出幾個頭信息字段。
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
上面的頭信息之中,有三個與 CORS 請求相關的字段,都以Access-Control-開頭。
(1)Access-Control-Allow-Origin
該字段是必須的。它的值要么是請求時Origin字段的值,要么是一個*,表示接受任意域名的請求。
(2)Access-Control-Allow-Credentials
該字段可選。它的值是一個布爾值,表示是否允許發送 Cookie。默認情況下,Cookie 不包括在 CORS 請求之中。設為true,即表示服務器明確許可,瀏覽器可以把 Cookie 包含在請求中,一起發給服務器。這個值也只能設為true,如果服務器不要瀏覽器發送 Cookie,不發送該字段即可。
(3)Access-Control-Expose-Headers
該字段可選。CORS 請求時,XMLHttpRequest對象的getResponseHeader()方法只能拿到6個服務器返回的基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必須在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader("FooBar")可以返回FooBar字段的值。
withCredentials 屬性服務器可能需要拿到 Cookie,這時需要服務器顯式指定Access-Control-Allow-Credentials字段,告訴瀏覽器可以發送 Cookie
同時,開發者必須在 AJAX 請求中打開withCredentials屬性。
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
否則,即使服務器要求發送 Cookie,瀏覽器也不會發送。或者,服務器要求設置 Cookie,瀏覽器也不會處理
需要注意的是,如果服務器要求瀏覽器發送 Cookie,Access-Control-Allow-Origin就不能設為星號,必須指定明確的、與請求網頁一致的域名。同時,Cookie 依然遵循同源政策,只有用服務器域名設置的 Cookie 才會上傳,其他域名的 Cookie 并不會上傳,且(跨域)原網頁代碼中的document.cookie也無法讀取服務器域名下的 Cookie
非簡單請求 檢查header,method,origin非簡單請求是那種對服務器提出特殊要求的請求,比如請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json
非簡單請求的 CORS 請求,會在正式通信之前,增加一次 HTTP 查詢請求,稱為“預檢”請求(preflight)。
瀏覽器先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些 HTTP 動詞和頭信息字段。
只有得到肯定答復,瀏覽器才會發出正式的XMLHttpRequest請求,否則就報錯。
這是為了防止這些新增的請求,對傳統的沒有 CORS 支持的服務器形成壓力,給服務器一個提前拒絕的機會,這樣可以防止服務器收到大量DELETE和PUT請求,這些傳統的表單不可能跨域發出的請求。
下面是一段瀏覽器的 JavaScript 腳本。
var url = "http://api.alice.com/cors";
var xhr = new XMLHttpRequest();
xhr.open("PUT", url, true);
xhr.setRequestHeader("X-Custom-Header", "value");
xhr.send();
上面代碼中,HTTP 請求的方法是PUT,并且發送一個自定義頭信息X-Custom-Header。
瀏覽器發現,這是一個非簡單請求,就自動發出一個“預檢”請求,要求服務器確認可以這樣請求。下面是這個“預檢”請求的 HTTP 頭信息。
OPTIONS /cors HTTP/1.1
Origin: http://api.bob.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...
“預檢”請求用的請求方法是OPTIONS,表示這個請求是用來詢問的。頭信息里面,關鍵字段是Origin,表示請求來自哪個源。
除了Origin字段,“預檢”請求的頭信息包括兩個特殊字段。
(1)Access-Control-Request-Method
該字段是必須的,用來列出瀏覽器的 CORS 請求會用到哪些 HTTP 方法,上例是PUT。
(2)Access-Control-Request-Headers
該字段是一個逗號分隔的字符串,指定瀏覽器 CORS 請求會額外發送的頭信息字段,上例是X-Custom-Header。
服務器回應的其他 CORS 相關字段如下。
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000
(1)Access-Control-Allow-Methods
該字段必需,它的值是逗號分隔的一個字符串,表明服務器支持的所有跨域請求的方法。注意,返回的是所有支持的方法,而不單是瀏覽器請求的那個方法。這是為了避免多次“預檢”請求。
(2)Access-Control-Allow-Headers
如果瀏覽器請求包括Access-Control-Request-Headers字段,則Access-Control-Allow-Headers字段是必需的。它也是一個逗號分隔的字符串,表明服務器支持的所有頭信息字段,不限于瀏覽器在“預檢”中請求的字段。
(3)Access-Control-Allow-Credentials
該字段與簡單請求時的含義相同。
(4)Access-Control-Max-Age
該字段可選,用來指定本次預檢請求的有效期,單位為秒。上面結果中,有效期是20天(1728000秒),即允許緩存該條回應1728000秒(即20天),在此期間,不用發出另一條預檢請求。
預檢請求 預檢請求的回應 瀏覽器的正常請求和回應一旦服務器通過了“預檢”請求,以后每次瀏覽器正常的 CORS 請求,就都跟簡單請求一樣,會有一個Origin頭信息字段。服務器的回應,也都會有一個Access-Control-Allow-Origin頭信息字段。
下面是“預檢”請求之后,瀏覽器的正常 CORS 請求。
PUT /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
X-Custom-Header: value
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...
上面頭信息的Origin字段是瀏覽器自動添加的。
下面是服務器正常的回應。
Access-Control-Allow-Origin: http://api.bob.com
Content-Type: text/html; charset=utf-8
上面頭信息中,Access-Control-Allow-Origin字段是每次回應都必定包含的。
CORS 與 JSONP 的使用目的相同,但是比 JSONP 更強大。JSONP 只支持GET請求,CORS 支持所有類型的 HTTP 請求。JSONP 的優勢在于支持老式瀏覽器,以及可以向不支持 CORS 的網站請求數據
參考鏈接
簡介
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106156.html
摘要:什么是跨域個人一句話解釋如果與不同源,那么頁面不能獲取頁面的資源。所以用同源策略來限制跨域是必須的。它是標準,是跨源請求的根本解決方法。 本文整理了一些有關跨域的基礎知識和細節問題。 什么是跨域 個人一句話解釋:如果 url A 與 url B 不同源,那么頁面A不能獲取頁面B的資源。這里有兩個關鍵詞:url 和 同源,瀏覽器的同源策略就是針對兩個url,它們滿足以下三個條件,才是同源...
摘要:超文本傳輸協議訪問該資源。它的基本思想是,網頁通過添加一個元素,向服務器請求數據,這種做法不受同源政策限制服務器收到請求后,將數據放在一個指定名字的回調函數里傳回來。該字段也可以設為星號,表示同意任意跨源請求。 前言:隨著工作時間的增長,前面學過的東西開始慢慢遺忘,抽空的時候就將一些資料整理整理,順一順,也當作一種溫習。我只是前端工匠,防止自己成為【一斷網就無法工作的程序員】 url的...
閱讀 2418·2021-10-11 10:57
閱讀 1274·2021-10-09 09:59
閱讀 1986·2019-08-30 15:53
閱讀 3206·2019-08-30 15:53
閱讀 1000·2019-08-30 15:45
閱讀 727·2019-08-30 15:44
閱讀 3432·2019-08-30 14:24
閱讀 945·2019-08-30 14:21