本地也能夠輕鬆模擬跨域請求,以及解決跨域請求的方式
web.html
請求接口json.json
,其實它們都在相同的本地服務器目錄下javascript
以localhost/cors/web.html
訪問頁面,但是這個頁面調用的接口地址是http://127.0.0.1/cors/json.json
php
var url = "http://127.0.0.1/cors/json.json" fetch(url) .then(res => res.json()) .then(resJson => console.log(resJson))
localhost
與127.0.0.1
域名不一樣,也即跨域html
Access-Control-Allow-Origin:*
)//js var url = "http://127.0.0.1/cors/php.php" fetch(url) .then(res => res.json()) .then(resJson => console.log(resJson)) //php header('Access-Control-Allow-Origin:*'); echo '{"name": "lofayo"}';
(這樣就能輕鬆實現跨域請求)java
Access-Control-Allow-Origin:http://localhost
)(服務器端設置響應頭 Access-Control-Allow-origin: *,容許了任何來源origin的訪問,其實這個地方能夠設置和請求頭相同的origin的值,只是這樣設置太麻煩了,本地測試須要服務端設置一次,若是本地測試同一個接口由多人請求,還要設置屢次,正式上線了還要設置一次,太麻煩了)web
//js http://localhost/cors/web.html var url = "http://127.0.0.1/cors/php.php" fetch(url) .then(res => res.json()) .then(resJson => console.log(resJson)) //發起該請求,會在請求頭裏自動設置origin字段值爲當前頁面,如:origin:http://localhost //php //服務器端設置和origin相同的值 header('Access-Control-Allow-Origin:localhost'); echo '{"name": "lofayo"}';
(雖然能實現,一個接口從測試到上線須要服務器端屢次設置,太麻煩了)json
jsonp的實現分三步走:跨域
//一、定義好接收數據的函數 <script type="text/javascript"> function requestName(json) { console.log(json); } </script> //二、經過script標籤的src實現跨域,只是這個url帶有查詢參數(回調函數) <script src="http://127.0.0.1/cors/php.php?callback=requestName"></script> //php文件接收查詢參數,並返回由回調函數包裹數據的總體 $requstName = $_GET['callback']; $data = "{'name': 'lofayo'}"; echo $requstName . "(" . $data . ")";
全部上述跨域請求,都須要服務器端的參與設置,叨擾別人的事終究仍是麻煩了些。想實現的是,即便服務器端不容許跨域,可是僅僅在客戶端設置依然可以實現的跨域請求瀏覽器
好比:接口數據在http://127.0.0.1/cors/php.php服務器
訪問頁面地址爲:http://localhost/cors/web.html,該頁面請求的接口,瀏覽器會在請求頭裏默認設置:cors
Origin:http://localhost Referer:http://localhost/cors/web.html
既然如此,我只須要手動模擬origin字段值,把他設置爲和服務器相同的域不就能夠了,設置origin字段值:
Origin:http://127.0.0.1
可事與願違,在http請求裏設置不了該字段的值