1. 程式人生 > >【TaoTao】使用JQueryJsonp 完美解決JS跨域問題

【TaoTao】使用JQueryJsonp 完美解決JS跨域問題

問題描述:

        我有一段資源.json檔案是放到後臺的taotao-rest提供服務的介面專案當中,我前臺另起了一個maven的專案taotao-portal。web伺服器都是Tomcat,後臺埠8081,前臺埠8082。當我從前臺訪問這一段json資源的時候,就出現了跨域問題。

       提示了不同源的URL禁止訪問


什麼是JS跨域:

       JS為了安全,有個限制,不允許跨域訪問,簡單的說就是域名不同就是跨域了,我們專案中遇到的是域名相同,埠不同。還有一種情況是IP不同。使用JS沒有辦法直接使用ajax(ajax請求受同源策略影響)請求rest後臺提供的服務。

解決問題:

        在JS中可以使用jsonp解決跨域問題,在js中不能跨域,但是可以跨域請求一段片段,src載入的js片段。我們可以把資料包裝成JS片段,寫一個方法,把json資料作為引數傳遞。形成一個方法的呼叫語句。可以使用ajax請求js片段,當js片段到達瀏覽器會被立即執行,就可以獲得資料引數了。在瀏覽器端,先建立好callback方法,在引數中獲取資料。

如圖所示:


程式碼思路:

1.寫callback函式

2.ajax請求,把方法名傳遞給服務端

3.服務端接收回調方法名,把資料包裝好,響應給客戶端。

程式碼:

FN_GetData: function() {
    	//使用jsonp來實現跨域請求
        $.getJSONP(this.URL_Serv, category.getDataService);
    	//直接使用ajax請求json資料
//    	$.getJSON(this.URL_Serv, function(json){
//    		category.getDataService(json);
//    	});
    },

URL_Serv: "http://localhost:8081/category.json?callback=category.getDataService",


總結:

        jQuery提供的getJsonp方法輕鬆的解決跨域訪問的問題,可以獲取json格式的資料。但是同樣有問題存在,ajax的核心是通過XmlHttpRequest獲取非本頁內容,而jsonp的核心則是動態新增<script>標籤來呼叫伺服器提供的js指令碼。jsonp請求伺服器端資料,如果被不信任的服務使用時會很危險。