分散式環境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的跨域請求瞭解還不是很多,望多多指點,解決跨域問題還有其他的相關方法,在這裡推薦一篇文章,這篇文章介紹了多種方法,大家有興趣可以去學習一下。文章