1. 程式人生 > >跨域資源共享 CORS 深入學習

跨域資源共享 CORS 深入學習

瀏覽器將CORS請求分成兩類:簡單請求和非簡單請求。簡單請求在之前部落格中總結過了,詳見傳送門
這裡主要總結一下非簡單請求。非簡單請求是那種對伺服器有特殊要求的請求,比如請求方法是PUT或DELETE,或者Content-Type欄位的型別是application/json。

預檢請求

非簡單請求的CORS請求,會在正式通訊之前,增加一次HTTP查詢請求,稱為預檢請求(preflight)
瀏覽器先詢問伺服器,當前網頁所在的域名是否在伺服器的許可名單之中,以及可以使用哪些HTTP動詞和頭資訊欄位。只有得到肯定答覆,瀏覽器才會發出正式的XMLHttpRequest請求,否則就報錯。
Demo:

<script type="text/javascript">
        function createXhr(){
            if(typeof XMLHttpRequest){
                return new XMLHttpRequest();
            }else if(typeof ActiveXObject){
                return new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
        var xhr=createXhr();
        xhr.onreadystatechange=function
(){
if(xhr.readyState==4){ if(xhr.status==200){ var data = JSON.parse(xhr.responseText); console.log(data.name+'--'+data.age+'--'+data.job);//lisi--24--worker } } } xhr.open("put","http://www.abc.com/mywork/21code/example.php",true
); xhr.setRequestHeader('X-Custom-Header', 'value'); xhr.send(null);
</script>

example.php

<?php
    header("Content-Type: text/plain");//文字型別
    //允許的域名
    header("Access-Control-Allow-Origin:http://www.example.com");
    //響應型別
    header("Access-Control-Allow-Methods: GET, POST, PUT");
    //頭部欄位
    header("Access-Control-Allow-Headers: X-Custom-Header");
    $res = array('name'=>'lisi','age'=>24,'job'=>'worker');
    echo json_encode($res);
?>

上面程式碼中,HTTP請求的方法是PUT,並且傳送一個自定義頭資訊X-Custom-Header。
瀏覽器發現,這是一個非簡單請求,就自動發出一個預檢請求,要求伺服器確認可以這樣請求。下面是這個預檢請求的HTTP頭資訊以及預檢請求的迴應。
這裡寫圖片描述
預檢請求用的請求方法是OPTIONS,表示這個請求是用來詢問的。頭資訊裡面,關鍵欄位是Origin,表示請求來自哪個源。
除了Origin欄位,預檢請求的頭資訊包括兩個特殊欄位:

  • Access-Control-Request-Method
    該欄位是必須的,用來列出瀏覽器的CORS請求會用到哪些HTTP方法,上面例子中是PUT。
  • Access-Control-Request-Headers
    該欄位是一個逗號分隔的字串,指定瀏覽器CORS請求會額外發送的頭資訊欄位,上例是X-Custom-Header。
    這裡寫圖片描述
    伺服器收到預檢請求後,檢查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers欄位以後,確認允許跨源請求,就可以做出迴應。
    上面的HTTP迴應中,關鍵的是Access-Control-Allow-Origin欄位,表示http://www.example.com可以請求資料。該欄位也可以設為星號,表示同意任意跨源請求。
    如果瀏覽器否定了預檢請求,會返回一個正常的HTTP迴應,但是沒有任何CORS相關的頭資訊欄位。這時,瀏覽器就會認定,伺服器不同意預檢請求,因此觸發一個錯誤,被XMLHttpRequest物件的onerror回撥函式捕獲。控制檯會打印出相應的報錯資訊。

伺服器響應的其他CORS相關欄位

Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 180000
  • Access-Control-Allow-Methods
    該欄位必需,它的值是逗號分隔的一個字串,表明伺服器支援的所有跨域請求的方法。注意,返回的是所有支援的方法,而不單是瀏覽器請求的那個方法。這是為了避免多次預檢請求。
  • Access-Control-Allow-Headers
    如果瀏覽器請求包括Access-Control-Request-Headers欄位,則Access-Control-Allow-Headers欄位是必需的。它也是一個逗號分隔的字串,表明伺服器支援的所有頭資訊欄位,不限於瀏覽器在預檢中請求的欄位。
  • Access-Control-Allow-Credentials
    該欄位可選。它的值是一個布林值,表示是否允許傳送Cookie。預設情況下,Cookie不包括在CORS請求之中。設為true,即表示伺服器明確許可,Cookie可以包含在請求中,一起發給伺服器。這個值也只能設為true,如果伺服器不要瀏覽器傳送Cookie,刪除該欄位即可。
  • Access-Control-Max-Age
    該欄位可選,用來指定本次預檢請求的有效期,單位為秒。上面結果中,有效期是180000秒,即允許快取該條響應180000秒,在此期間,不用發出另一條預檢請求。

瀏覽器的正常請求和響應

一旦伺服器通過了預檢請求,以後每次瀏覽器正常的CORS請求,就都跟簡單請求一樣,會有一個Origin頭資訊欄位。伺服器的響應,也都會有一個Access-Control-Allow-Origin頭資訊欄位。
經過預檢請求後,正式通訊的請求與相應如下所示:
這裡寫圖片描述
上面請求頭資訊的Origin欄位是瀏覽器自動新增的,Access-Control-Allow-Origin欄位是每次響應都必定包含的。

最後要對阮一峰大大送上最誠摯的敬意,博文寫的言簡意賅,自己從中獲益良多,非常感謝大大的無私分享。給自己加個油,fighting!!!
參考博文:
跨域資源共享 CORS 詳解

相關推薦

資源共享 CORS 深入學習

瀏覽器將CORS請求分成兩類:簡單請求和非簡單請求。簡單請求在之前部落格中總結過了,詳見傳送門 這裡主要總結一下非簡單請求。非簡單請求是那種對伺服器有特殊要求的請求,比如請求方法是PUT或DELETE,或者Content-Type欄位的型別是applicati

資源共享CORS詳解

附加 accep 不發送 地址 code 克服 通信 數據 ror 簡介 CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。 它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了AJAX

資源共享(CORS)

flight turn 地理 add example html 變化 ring 否則   通過 XHR 實現 Ajax 通信的一個主要限制,來源於跨域安全策略。默認情況下,XHR 對象只能訪 問與包含它的頁面位於同一個域中的資源。這種安全策略可以預防某些惡意行為。但是,實現

資源共享——CORS

跨域資源共享(Cross-Origin Resource Sharing)是一種機制,它使用額外的 HTTP 頭部告訴瀏覽器可以讓一個web應用進行跨域資源請求。 請求型別 簡單請求 若一個請求同時滿足下述所有條件,則該請求可視為“簡單請求”(注:灰色字型內容瞭解即可): 使用的方法為

資源共享(CORS)安全性淺析

0×00 背景 提起瀏覽器的同源策略,大家都很熟悉。不同域的客戶端指令碼不能讀寫對方的資源。但是實踐中有一些場景需要跨域的讀寫,所以出現了一些hack的方式來跨域。比如在同域內做一個代理,JSON-P等。但這些方式都存在缺陷,無法完美的實現跨域讀寫。所以在XMLHttpRequest

jQuery-ajax系列用法及JSONP,資源共享CORS

jQuery-ajax 基本使用 $.ajax({ url:'json.php', //設定的是請求引數,二者沒關係 data:{name:'張三',age:'18'}, //用於設定響應體型別 dataType:'json', type:'

資源共享CORS

1. 同源政策 1.1 含義 1995年,同源政策由 Netscape 公司引入瀏覽器。目前,所有瀏覽器都實行這個政策。 最初,它的含義是指,A網頁設定的 Cookie,B網頁不能開啟,除非這兩個網頁”同源”。所謂”同源”指的是”三個相同”。

資源共享 CORS 詳解

一、簡介 CORS需要瀏覽器和伺服器同時支援。目前,所有瀏覽器都支援該功能,IE瀏覽器不能低於IE10。 整個CORS通訊過程,都是瀏覽器自動完成,不需要使用者參與。對於開發者來說,CORS通訊與同源的AJAX通訊沒有差別,程式碼完全一樣。瀏覽器一旦發現AJAX請求

資源共享 CORS 詳解( 阮一峰)

CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。

CORS資源共享你該知道的事兒

自身 沒有 對象的使用方法 one 一起 接受 gpm spa eat “嘮嗑之前,一些客套話” CORS跨域資源共享,這個話題大家一定不陌生了,吃久了大轉轉公眾號的深度技術好文,也該吃點兒小米粥溜溜胃裏的縫兒了,今天咱們就再好好屢屢CORS跨域資源共享這個話題,大牛怡情

HTTP(二)、資源共享CORS

2.跨域資源共享(CORS) 跨域簡介 當訪問一個資原始檔時,如果從非該資原始檔所在的伺服器不同域名或者埠處進行訪問時,該資源會發起一個跨域請求。 例如,網站A的地址是http://www.domain-a.com ,該網站中HTML頁面通過 img 標籤中的

CORS資源共享

簡介 跨域資源共享的主要思想就是使用自定義的HTTP頭部讓瀏覽器與伺服器進行溝通,從而決定響應式是成功還是失敗,它允許了瀏覽器向跨源伺服器傳送請求,克服了同源的限制。 CORS需要瀏覽器和伺服器同時支援,所有瀏覽器目前都支援,IE需要10以上。在整個通訊過程中,不需要使用者參與,都是由瀏覽器

Access-Control-Allow- 設定 CORS(資源共享)詳解

跨域訪問的專案常在過濾器或者攔截器中新增如下配置     response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allo

java服務端解決js的問題 CORS資源共享) 的配置

nginx相容跨域上傳 相容情況: 各種新版本的ie10,firefox,opera,safari,chrome以及移動版safari和Android瀏覽器 ie9及一下版本請使用flash方式來相容 通過OPTIONS請求握手一次的方式實現跨根域傳送請求,需要服務端配置

DAY104 - 路飛學城(一)- CORS資源共享和pycharm開發vue專案

一、CORS跨域資源共享 1.什麼是CORS跨域資源共享 ​ 為了解決跨域問題,就需要CORS。 ​ CORS需要瀏覽器和伺服器同時支援。目前,所有瀏覽器都支援該功能,IE瀏覽器不能低於IE10。 ​ 整個CORS通訊過程,都是瀏覽器自動完成,不需要使用者參與。對於開發者來說,CORS通訊與同源的AJ

前後端互動問題解決方案,資源共享CORS

跨域資源共享(CORS) 普通跨域請求:只服務端設定Access-Control-Allow-Origin即可,前端無須設定,若要帶cookie請求:前後端都需要設定。 需注意的是:由於同源策略的限制,所讀取的cookie為跨域請求介面所在域的cookie,而非當前頁。如

cors資源共享方法

cors是一個服務端和客戶端協作宣告的方式來確保請求的安全性。 服務端在HTTP請求頭增加一些列的請求頭資訊(例如Access-Control-Allow-Orign等),說明哪些域的請求可以接受,或哪些型別的請求可以接受。 客戶端在發起請求時,也必須在請求

的另一種解決方案——CORS(Cross-Origin Resource Sharing)資源共享

      在我們日常的專案開發時使用AJAX,傳統的Ajax請求只能獲取在同一個域名下面的資源,但是HTML5打破了這個限制,允許Ajax發起跨域的請求。瀏覽器是可以發起跨域請求的,比如你可以外鏈一個外域的圖片或者指令碼。但是Javascript指令碼是不能獲取這些資源的內容的,它只能被瀏覽器執行或渲染。主

tomcat下CORS資源共享) 的配置

CORS介紹    它在維基百科上的定義是:跨域資源共享(CORS )是一種網路瀏覽器的技術規範,它為Web伺服器定義了一種方式,允許網頁從不同的域訪問其資源。而這種訪問是被同源策略所禁止的。CORS系統定義了一種瀏覽器和伺服器互動的方式來確定是否允許跨域請求。 它是

AJAX請求和CORS資源共享

同源策略限制: 同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果沒有同源策略,攻擊者可以通過JavaScript獲取你的郵件以及其他敏感資訊,比如說閱讀私密郵件,傳送虛假郵件,檢視聊天記錄等等。所謂同源是指,