一、使用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'); }
現在如果直接使用上面的腳本進行請求,會看到瀏覽器里控制台的報錯如下:
錯誤顯示的很明顯,這是因為我們還未設置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
微信公眾號: