一、使用jQuery的方式做JSONP跨域
$.ajax({
url: "http://blog.csdn.net/Api",
data: "key=word&jsoncallback=?",
dataType: "jsonp",
type: "get",
success: function (data) {
//此處是傳回的資料
},
error: function (e) {
}
});
目前jquery庫已經全面支援跨域的方式,此方式實際上底層也是通過script标簽的方式進行跨域,下面會介紹script标簽的方式。
通過dataType指定jsonp,底層封裝後,會在head标簽後面追加<script src="http://blog.csdn.net/Api?key=word&jsoncallback=funcName"></script>
所有的jsonP都是這個原理,借助script标簽的跨域特性來實作,funcName再jquery中是自動生成的,背景會擷取jsoncallback參數,擷取對應的函數名稱,最後包裝成想要的格式,比如最後輸出結果是:funcName({"result":"suc","code":"1000"}),那麼再Jquery中,會将該方法直接指定給success方法,最後來接收傳回的資料。
二、使用CORS跨域
要使用CORS,我們需要了解前端和伺服器端的使用方法。
1、 前端
以前我們使用Ajax,代碼類似于如下的方式:
var xhr = new XMLHttpRequest();
xhr.open("GET", "/api", true);
xhr.send();
這裡的“/hfahe”是本域的相對路徑。
如果我們要使用CORS,相關Ajax代碼可能如下所示:
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://blog.csdn.net/api", true);
xhr.send();
請注意,代碼與之前的差別就在于相對路徑換成了其他域的絕對路徑,也就是你要跨域通路的接口位址。
我們還必須提供浏覽器回退功能檢測和支援,避免浏覽器不支援的情況。
function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// 此時即支援CORS的情況
// 檢查XMLHttpRequest對象是否有“withCredentials”屬性
// “withCredentials”僅存在于XMLHTTPRequest2對象裡
xhr.open(method, url, true);
} else if (typeof!= "undefined") {
// 否則檢查是否支援XDomainRequest,IE8和IE9支援
// XDomainRequest僅存在于IE中,是IE用于支援CORS請求的方式
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// 否則,浏覽器不支援CORS
xhr = null;
}
return xhr;
}
var xhr = createCORSRequest('GET', url);
if (!xhr) {
throw new Error('CORS not supported');
}
現在如果直接使用上面的腳本進行請求,會看到浏覽器裡控制台的報錯如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxcDMwMTM1cTOtIzN4cTMyQTNxEjM3AjNxAjMtkzM1kDN48CX3AjNxAjMvwVOzUTO0gzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
錯誤顯示的很明顯,這是因為我們還未設定Access-Control-Allow-Origin頭。
2、 伺服器
伺服器端對于CORS的支援,主要就是通過設定Access-Control-Allow-Origin來進行的。如果浏覽器檢測到相應的設定,就可以允許Ajax進行跨域的通路。
HTTP 頭的設定方法有很多,http://enable-cors.org/這篇文章裡對各種伺服器和語言的設定都有詳細的介紹,下面我們主要介紹Apache和PHP裡的設定方法。
Apache:Apache需要使用mod_headers子產品來激活HTTP頭的設定,它預設是激活的。你隻需要在Apache配置檔案的<Directory>, <Location>, <Files>或<VirtualHost>的配置裡加入以下内容即可:
- Header set Access-Control-Allow-Origin *
PHP:隻需要使用如下的代碼設定即可。
- <?php
- header("Access-Control-Allow-Origin:*");
以上的配置的含義是允許任何域發起的請求都可以擷取目前伺服器的資料。當然,這樣有很大的危險性,惡意站點可能通過XSS攻擊我們的伺服器。是以我們應該盡量有針對性的對限制安全的來源,例如下面的設定使得隻有http://blog.csdn.net這個域才能跨域通路伺服器的API。
Access-Control-Allow-Origin: http://blog.csdn.net
小米商城課程
https://coding.imooc.com/class/397.html
微信小程式、公衆号和小程式雲開發的微信授權、分享、支付和手機号擷取的專項課程:
https://coding.imooc.com/class/343.html
React全家桶開發通用的背景管理系統:
https://coding.imooc.com/class/236.html
Vue2.6+Vue-Router+Vuex+Node+Mongo開發全棧商城課程
https://coding.imooc.com/class/113.html
慕課講師:河畔一角
講師位址:http://www.imooc.com/u/1343480
微信公衆号: