- 為什么會有跨域問題?
因為瀏覽器的同源策略- 同源策略是什么?
協議,域名,端口都相同- 如果非同源,會受到什么限制?
(1) Cookie、LocalStorage 和 IndexDB 無法讀取
(2) DOM 無法獲得
(3) AJAX 請求不能發送
怎樣解決非同源發送請求,也就是跨域問題呢,有以下幾種方法
CORS
- 客戶端可以使用XMLHttpRequest發送請求,請求路徑為絕對路徑,服務端返回的數據在
xhr.responseText
中 - 如果服務器認為可以接受,就在
Access-Control-Allow-Origin
中返回相應的源或 * - 克服了AJAX只能同源使用的限制
res.header("Access-Control-Allow-Origin", "*");
JSONP
- 通過使用動態
<script>
實現跨域,在url中指定回調函數 - 能直接訪問響應文本,支持瀏覽器和服務器的雙向通信
script.src = "http://www.baidu.com/?callback=handleResponse"
function handleResponse(res){
//res是服務端返回的數據
}
類似的還有 圖像Ping,因為一個網頁可以從任何網頁中加載圖片,不用擔心跨域問題,所以,凡是擁有src
這個屬性的標簽都擁有跨域的能力,缺點是無法訪問響應文本,適用于瀏覽器和服務器間的單向通信
let img = new Image();
img.src = "http://"
兩者的區別
-
JSONP
是Jquery
提供的跨域方式,JSONP
只支持get
方式的請求 -
CORS
是W3C
提供的一個跨域標準 ,CORS
支持所有類型的http
請求