由於同源策略
的限制,想跨域須要一些特殊方法,目前跨域有多種方式CORS
、jsonp
、iframe
等,本文主要講解http cors。javascript
簡單請求(Simple requests)知足如下條件就是簡單請求,就不會觸發預檢請求。java
預檢請求(Preflighted requests)會先發起methed爲OPTIONS
請求以獲取是否容許該實際請求,若是容許再發送實際請求。ajax
簡單請求
和預檢請求
通常按照正常的ajax或者fetch請求發送,但若是想攜帶cookie
驗證身份信息,須要設置withCredentials
,並且服務器響應Access-Control-Allow-Origin
須要指定當前頁面host。json
var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/credentialed-content/';
function callOtherDomain(){
if(invocation) {
invocation.open('GET', url, true);
invocation.withCredentials = true;
invocation.onreadystatechange = handler;
invocation.send();
}
}
複製代碼
cookie
有Domain做用域的,不一樣主域是沒法獲取cookie的,因此攜帶的cookie只會是請求目標服務器同域的,Cookie的做用域。跨域
能夠設置如下參數瀏覽器
Access-Control-Allow-Origin: http://test.com // 容許域名
Access-Control-Allow-Methods: POST, GET, OPTIONS // 容許方法
Access-Control-Allow-Credentials: true // 容許瀏覽器讀取response
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type // 自定義頭部字段
Access-Control-Max-Age: 86400 // 有效時間
複製代碼
若是隻是預檢請求設置Access-Control-Allow-Origin
,在實際請求後將跨域頁面仍是沒法獲取響應數據。服務器
一、 預檢請求cookie
主要設置如下參數:cors
Access-Control-Allow-Origin: http://test.com // 容許域名
Access-Control-Allow-Methods: POST, GET, OPTIONS // 容許方法
Access-Control-Allow-Credentials: true // 容許瀏覽器讀取response
複製代碼
只有當知足響應的條件,瀏覽器客戶端纔會發起實際請求。fetch
二、 實際請求
同簡單請求