跨域通路問題,相信大家都有遇到過。這是一個很棘手的問題。不過道高一尺,魔高一丈,對于這類問題,總有解決問題的方案。最近我又接觸到了這個問題,解決的途徑是ajax+jsonp。
說到這個問題,不得不說一下“同源政策(Same-Origin Policy)”,它是由Netscape提出的一個著名的安全政策。現在所有支援JavaScript 的浏覽器都會使用這個政策。所謂同源,就是必須協定、域名、端口都一緻的,才叫做同源。例如:http://www.12306.cn和https://www.12306.cn,由于協定不一緻,就不是同源。http://127.0.0.1:8080/test1和http://localhost:8080/test1
也不屬于同源,因為域名不一緻。端口不同當然也不叫同源了。
如果非同源,那麼在請求資料時,浏覽器會在控制台中報一個異常,提示拒絕通路。這是一個令web開發人員非常手疼的問題。比如,我現在打開百度網頁,然後在控制台中請求CSDN的網頁,那麼就會報如圖所示的異常:

在上圖中,大家可能會看到這個詞兒——“Access-Control-Allow-Origin”,它是W3C标準中為了解決同源政策引起的跨域問題而提出的一種技術——“跨域資源共享(CORS,Cross-Origin Resource Sharing)”。隻要你在服務端設定這個Access-Control-Allow-Origin的header就可以允許跨域通路了。有興趣的話,自己查一下,很簡單。不過它有安全隐患,主要是因為支援通配符*。每個網站都可以随意請求,那就太不安全了。如:
Query中$.ajax的get方法,是支援跨域通路的,不過dataType要設定為“jsonp”。Jsonp(JSON with Padding)是 json 的一種“使用模式”,可以讓網頁從别的網域擷取資料。jsonp是采用的js的回調機制來實作的。使用方式也很簡單,代碼如下:
在伺服器端,重新拼接json資料:
這樣就可以在浏覽器擷取到異源服務端傳回的json資料了。這裡傳回的跟json格式不一樣,它的格式是回調函數名+(json數組)。其中小括号不可以省略。否則請求是發送成功了,但是卻擷取不到資料,因為傳回的資料格式出錯了。效果圖如下: