在前端開發中,經常會使用到 jquery 進行異步請求操作。但是,由于安全原因瀏覽器限制了不同域名下的資源訪問(跨域問題),因此 jquery 跨域錯誤也屢見不鮮。
當我們在瀏覽器控制臺中看到以下提示時:
XMLHttpRequest cannot load http://example.com/api. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.
其實這是由于 api 請求的響應頭未攜帶 Access-Control-Allow-Origin,導致瀏覽器認為該請求不可信任。如何解決這樣的 jquery 跨域問題呢?下面提供兩種解決方案:
1. 在服務端配置 Access-Control-Allow-Origin
在 api 請求響應頭中添加 Access-Control-Allow-Origin 字段,允許指定域名的跨域請求。例如:
Access-Control-Allow-Origin: http://localhost
這里我們使用 php 代碼實現:
header('Access-Control-Allow-Origin: http://localhost'); header('Access-Control-Allow-Headers: X-Requested-With'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
2. 使用 jquery 的 jsonp 方式
jQuery.ajax({ type: 'GET', url: 'http://example.com/api', dataType: 'jsonp', // 返回 JSONP 格式的數據 jsonp: 'callback', // 指定回調函數名的鍵名 success: function(data){ console.log(data); } });
jsonp 方式是使用 script 標簽進行跨域請求,在響應數據中加入 js 語句,會返回 callback(data) 函數的執行,從而達到跨域的目的。
以上兩種方式中,使用第一種方式需要服務端改動,第二種方式依賴于數據格式的支持,適用場景不同。