天天看點

CORS 請求未能成功_CORS跨域

什麼是跨域?

簡單的來說,出于安全方面的考慮,頁面中的JavaScript無法通路其他伺服器上的資料,即“同源政策”。而跨域就是通過某些手段來繞過同源政策限制,實作不同伺服器之間通信的效果。

CORS 請求未能成功_CORS跨域

CORS

CORS全稱“跨域資源共享”(Cross-Origin-Resource-Share)

CORS需要浏覽器和伺服器同時支援,才可以實作跨域請求,目前幾乎所有浏覽器都支援CORS,IE則不能低于IE10。CORS的整個過程都由浏覽器自動完成,前端無需做任何設定,跟平時發送ajax請求并無差異。是以,實作CORS的關鍵在于伺服器,隻要伺服器實作CORS接口,就可以實作跨域通信。

請求類型:

CORS分為簡單請求和非簡單請求兩種

符合以下條件,為簡單請求:

請求方式使用下列方法之一:
GET
HEAD
POST
 
Content-Type 的值僅限于下列三者之一:
text/plain
multipart/form-data
application/x-www-form-urlencoded
           

對于簡單請求,浏覽器會直接發送CORS請求,具體說來就是在header中加入origin請求頭字段。同樣,在響應頭中,傳回伺服器設定的相關CORS頭部字段,Access-Control-Allow-Origin字段為允許跨域請求的源。請求時浏覽器在請求頭的Origin中說明請求的源,伺服器收到後發現允許該源跨域請求,則會成功傳回,具體如下:

CORS 請求未能成功_CORS跨域

在這裡,http://localhost:3001為我們目前發送請求的源,如果伺服器發現請求在指定的源範圍内,則會傳回響應的請求結果, 否則會在控制台報錯,如下圖所示,在這裡需要注意的是,盡管請求失敗,但傳回的狀态碼依然可能為200。是以在做處理時需要格外注意。

CORS 請求未能成功_CORS跨域

非簡單請求(預檢請求)

使用了下面任一 HTTP 方法:
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
 
Content-Type 的值不屬于下列之一:
application/x-www-form-urlencoded
multipart/form-data
text/plain
           

當發生符合非簡單請求(預檢請求)的條件時,浏覽器會自動先發送一個options請求,如果發現伺服器支援該請求,則會将真正的請求發送到後端,反之,如果浏覽器發現服務端并不支援該請求,則會在控制台抛出錯誤,如下:

CORS 請求未能成功_CORS跨域

如果非簡單請求(預檢請求)發送成功,則會在頭部多傳回以下字段

Access-Control-Allow-Origin: http://localhost:3001  //該字段表明可供那個源跨域
Access-Control-Allow-Methods: GET, POST, PUT        // 該字段表明服務端支援的請求方法
Access-Control-Allow-Headers: X-Custom-Header       // 實際請求将攜帶的自定義請求首部字段
           

繼續閱讀