一、簡單請求與非簡單請求 跨域請求分為簡單與非簡單請求,同時滿足以下兩種條件的可以確定為簡單請求。 簡單請求的請求方法 簡單請求的HTTP頭信息 二、簡單請求處理原理 註意事項 三、非簡單請求處理原理 如果請求方法是PUT、DELETE,或者Content-type的類型為applicetion/j ...
一、簡單請求與非簡單請求
跨域請求分為簡單與非簡單請求,同時滿足以下兩種條件的可以確定為簡單請求。 簡單請求的請求方法
請求方法 | 說明 |
head | 發送頭部信息 |
get | |
post |
簡單請求的HTTP頭信息
http頭信息 | 說明 |
accept | 指定客戶端可以接受哪類信息,eg: image/git |
accept-language | 指定客戶端可以接受的自然語言,如果沒有指定,認為各語言都可以。eg:accept-language: zh-cn |
content-language | 描述實體報頭和資源所用的自然語言。沒有設置該規則認為實體內容將提供給所有的語言閱讀 |
Last-Event-ID | 最後一次接收到事件的標識符 |
content-type | 實體報文和資源的類型,只限於三個值:application/x-www-form-unlencoded、multipart/form-data、text/plain |
二、簡單請求處理原理
請求頭 | 說明 |
Access-Control-Allow-origin | 指定可以跨域訪問的網站,可以設置為*,表示所有res.setHeader("Access-Control-Allow-origin","http://localhost") |
Access-Control-Allow-Credentials | 有這個頭或者值為true,表示可接受跨域的cookies。而withCredentials是客戶端設置是否傳遞cookies到伺服器。 |
Access-Control-Expose-Headers | 預設cors請求。客戶端的xmlHttpRequrest只能拿到Cache-Control、Content-Language、Content-Type、Exprise、Last-Modified、Pragma等6個欄位,其他頭就需要通過Access-Control-Expose-Headers來指定 |
註意事項
- 設置了Access-Control-Allow-Credentials為true,或者有這個頭,那麼Access-Control-Allow-Origin就不能用*。
- 發送cookie時,Access-Control-Allow-Origin不能為*,cookie依然同源,只有伺服器功能變數名稱設置的cookie才會上傳的。
- 原網頁代碼中的document.cookie也無法讀取伺服器功能變數名稱下的cookie(客戶端),通過xmlHttp.getResponseHeader("set-cookies")也不可以的。
- xmlHttp可以獲取到foo、boo對象
res.setHeader("Access-Control-Allow-origin","*"); res.setHeader("Access-Control-Expose-Headers", "foo,boo"), res.setHeader("foo", "foo"); res.setHeader("boo", "boo");
三、非簡單請求處理原理
如果請求方法是PUT、DELETE,或者Content-type的類型為applicetion/json的。非簡單請求兩大步驟:
- 預驗證“請求”,瀏覽器會發送請求方法為options的請求,然後會帶上如下三個頭
頭部名稱 | 說明 |
Origin | 表示發送請求發送的源功能變數名稱 |
Access-Control-Request-Method | 需要跨域執行的請求方法(也可以叫動作) |
Access-Control-Request-Headers | 指定cors請求會額外發送的頭部信息,給客戶端自定義頭部的機會 |
- 服務判斷是否指定了Access-Control-Allow-Origin頭,並且值是可匹配的,驗證通過則輸出信息如下頭部內容:
頭部名稱 | 說明 |
Access-Control-Allow-Methods | 表明伺服器支持的cors請求方法,多個用逗號隔開 |
Access-Control-Allow-Headers | 如果請求有了Access-Control-Request-Headers頭,必須返回此頭,表明伺服器支持的所有頭部信息,多個用逗號隔開 |
Access-Control-Allow-Credentials | 與簡單請求一致 |
Access-Control-Max-Age | 指定本次預驗證的有效期,單位:秒 |
註意:
- Access-Control-Request-Headers和Access-Control-Request-Method不需要開發者來設置,這是瀏覽器自動識別的.Access-Control-Request-Headers根據請求的自定義頭生成,而Access-Control-Request-Method根據請求的方法生成。
- headers設置不對的表現:
3. 正確的設置:
四、跨域cookie的處理(不行)
- 跨域是設置不了cookie的。服務端輸出的cookie無效
- ajax獲取set-Cookies頭(客戶端),會提示錯誤