1. 程式人生 > >分散式環境Ajax的跨域請求

分散式環境Ajax的跨域請求

分散式結構優點

        在做該系統的過程中,系統的前臺和後臺是分開,但是都使用同一個資料庫,這樣設計架構的優點有:

       1、前臺系統和後臺的服務相分離,降低了系統的耦合度。

       2、有利於開發團隊的分工協作,提高開發的效率。

       3、可以靈活進行分散式的部署,也就是說當PC端和移動端都請求服務層時,服務層壓力或比較大,這樣可以單獨給服務層新增裝置,增加其可靠性。

問題

       但是如果進行分散式部署後,就會出現Ajax的跨域請求問題,例如現在的需求為頁面需要通過Ajax請求資料庫中的商品分類資訊,這時有兩種呼叫方式實現該功能:1、瀏覽器呼叫通過Ajax呼叫前臺工程,前臺工程呼叫服務層,服務層再查詢資料庫從而獲取商品分類資訊返回。2、瀏覽器直接通過Ajax呼叫服務層,服務層查詢資料庫獲取分類資訊。採用第2種方法較為方便,但是這時需要處理Ajax的跨域請求問題。

跨域

       跨域情況有域名不同的系統屬於跨域,域名相同但是埠不同的系統屬於跨域。Js出於安全考慮,只允許訪問域名且埠相同的系統。解決跨域問題的方法有很多,在這裡使用的方案為使用jsonp。

Jsonp

       js跨域請求資料不可以,但是,可以依據js可以跨域請求js指令碼的特點將需要請求的資料封裝成一個js語句獲取,做一個方法呼叫,跨域請求可以得到封裝了請求資料的js語句,再將資料作為引數傳遞到方法中,就可以獲取資料了,其中間都是通過js語句進行互動。

呼叫方法

       下面是js裡進行jsonp呼叫部分的程式碼。

var category = {
	URL_Serv: "請求的服務URL?callback=category.getDataService",
    },GetData: function() {
    	//使用jsonp來實現跨域請求
        $.getJSONP(this.URL_Serv, category.getDataService);
    },getDataService: function(a) {
		//解析獲取的資料
    }
}

       下面是服務層程式碼實現

       形式一:

@RequestMapping("/itemcat/all")
@ResponseBody
public Object getItemCatList(String callback) {
	//建立封裝好商品類別列表的pojo物件
	CatResult catResult = itemCatService.getItemCatList();
	//物件序列化,轉為字串
	MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(catResult);
	//jsonp包裝
	mappingJacksonValue.setJsonpFunction(callback);
	return mappingJacksonValue;
}
       形式二:
@RequestMapping(value="/itemcat/all", 
		produces=MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8")
@ResponseBody
public String getItemCatList(String callback) {
	//建立封裝好商品類別列表的pojo物件
	CatResult catResult = itemCatService.getItemCatList();
	//把pojo轉換成字串
	String json = JsonUtils.objectToJson(catResult);
	//拼裝返回值
	String result = callback + "(" + json + ");";
	return result;
}
       這裡的JsonUtils是自定義的一個工具類,用其中的物件轉json方法將物件轉化為json字串。

總結

       我對Ajax的跨域請求瞭解還不是很多,望多多指點,解決跨域問題還有其他的相關方法,在這裡推薦一篇文章,這篇文章介紹了多種方法,大家有興趣可以去學習一下。文章