1. 程式人生 > >解決跨域問題,實例調用百度地圖

解決跨域問題,實例調用百度地圖

同步 method 回調 資源 地圖api 官方 java 跨域傳輸 node

1.什麽是跨域?

瀏覽器對於javascript的同源策略的限制,例如a.com下面的js不能調用b.com中的js,對象或數據(因為a.com和b.com是不同域),所以跨域就出現了。同域的概念又是什麽呢?所謂的同源是指,域名、協議、端口均為相同。

2.如何解決跨域?

JSONP:
JSONP 是一種非官方的跨域數據交互協議。JSONP 本質上是利用 <script><img><iframe>等標簽不受同源策略限制,可以從不同域加載並執行資源的特性,來實現數據跨域傳輸。
JSONP由兩部分組成:回調函數和數據。回調函數是當響應到來時應該在頁面中調用的函數,而數據就是傳入回調函數中的JSON數據。<br/>這種方式非常好用,但是有一個缺陷,只能實現get請求。

設置代理:
可以在服務器搭建nginx代理轉發,或者由後臺去調用之後把結果返回給前端,後臺做一下中轉。還可以搭建node服務器,用node進行代理轉發。

請求的後臺設置允許跨域:
header(‘Access-Control-Allow-Origin:*‘);//允許所有來源訪問
header(‘Access-Control-Allow-Method:POST,GET‘);//允許訪問的方式

iframe:
所以跨域通信其實很簡單,在iframe和主頁裏都不斷地檢測hashtag有沒有變化,一旦有變化,就做出相應的改變。


setInterval(function() {
    var hashVal = window.location.hash.substr(1);
    document.body.style.backgroundColor = hashVal;
}, 1000); 

這麽做的問題就是,需要不斷地去檢測hashtag是否改變,效率有點低,如果能通過原生的監聽來實現,就會更加高效和優雅。這裏就涉及到另一個iframe特性:可以設置其他iframe的大小,即使是不同域的。而頁面的resize事件是可以監聽的,所以就有了下面這個模型。<br/>
主頁面先把消息附加到hashtag,然後改變一個隱藏的(或者頁面外的)iframe的size。這個iframe會監聽resize事件,同時捕獲到hashtag。捕獲到hashtag後(也就是所需的數據),再對hashtag做進一步的處理。處理完後把數據傳到主頁內的一個iframe,或者直接操作該iframe。這樣就比較優雅地完成了跨域操作。

3.實例

最近在做一個涉及到地圖的項目,使用的是百度地圖API,就出現了跨域的問題。
http://api.map.baidu.com/geoc... 這個api的作用是獲取周邊地理信息,在調用的時候產生了跨域問題

技術分享圖片

後面采用了JSONP的方式解決


$.ajax({
    url: ‘http://api.map.baidu.com/geocoder/v2/?address=成都&amp;output=json&amp;ak=sn4yosvUfbGYsdffew3wq23114‘,
    type: ‘GET‘,
    async:false,//設置同步。ajax默認異步
    dataType: ‘jsonp‘,
    jsonp:‘callback‘,//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(默認為:callback)
    jsonpCallback:"callback",//自定義的jsonp回調函數名稱,默認為jQuery自動生成的隨機函數名
    timeout: 5000,
    contentType: ‘application/json; charset=utf-8‘,
    success: function (result){
        console.log(result);
    }
})

很多時候我們都會碰到跨域問題,但也有很多方法來解決跨域問題,在解決跨域時,我們也要註意一下安全性問題

來源:https://segmentfault.com/a/1190000017098253

解決跨域問題,實例調用百度地圖