最近一直在搞公眾號(hào)前臺(tái)開發(fā),遇到了ajax跨域請(qǐng)求的問題,像地區(qū)的省-市-縣三級(jí)聯(lián)動(dòng)、汽車品牌-車系-車款的三級(jí)聯(lián)動(dòng)查詢等都需要調(diào)用外部接口(其他工程項(xiàng)目的接口)完成。下面就分享一下個(gè)人解決跨域請(qǐng)求的方案,當(dāng)然是在后臺(tái)程序猿大哥的幫助下,我才弄明白了其中的淵源,趕緊記錄下來慢慢積累,也希望對(duì)大家能有所幫助,還請(qǐng)積極提出意見或建議。
跨域請(qǐng)求需要借助后臺(tái)代碼接收callback回調(diào)函數(shù),對(duì)json數(shù)據(jù)進(jìn)行進(jìn)一步處理;前臺(tái)再用ajax請(qǐng)求向服務(wù)器發(fā)送callback參數(shù),并指定數(shù)據(jù)格式為jsonp。
1.CarBrandController.java(汽車品牌接口java文件),這里列出的方法主要用來根據(jù)不同的level值查詢對(duì)應(yīng)的品牌、車系、車款,在這里對(duì)跨域請(qǐng)求做一個(gè)接收回調(diào)函數(shù)的處理,如果返回的callback為null,則不是跨域請(qǐng)求,不需要做特殊處理,直接打印json接口數(shù)據(jù)即可;如果返回的callback不為null,則表示跨域請(qǐng)求,這時(shí)要對(duì)json數(shù)據(jù)做一個(gè)特殊處理,即在json數(shù)據(jù)的外層加一對(duì)小括號(hào)包起來,具體請(qǐng)看HttpAdapter.java文件中的printlnJSONObject方法。
public void json(HttpServletRequest request,HttpServletResponse response){ Map<String,Object>map=new HashMap<String, Object>(); String id = request.getParameter("id"); //接收ajax請(qǐng)求帶過來的id String level = request.getParameter("level"); //接收ajax請(qǐng)求帶過來的level String callback=request.getParameter("callback"); //接收ajax請(qǐng)求帶過來的callback參數(shù) if ("1".equals(level)) { //如果level是'1',則查詢第一級(jí)目錄內(nèi)容 map.put("results", this.carBrandService.findByAttr(null, "first_letter asc")); //調(diào)用查詢方法,結(jié)果放入map } else if ("2".equals(level)) { //如果level是'2',則查詢第二級(jí)目錄內(nèi)容 map.put("results", this.carSerieService.findByAttr("parent_id="+id, "first_letter asc"));//調(diào)用查詢方法,結(jié)果放入map } else if ("3".equals(level)) { //如果level是'3',則查詢第三極目錄內(nèi)容 map.put("results", this.carModelYearService.findByAttr("parent_id="+id, "jian_pin desc"));//調(diào)用查詢方法,結(jié)果放入map } map.put("level",level); if (null==callback) { //如果接收的callback值為null,則是不跨域的請(qǐng)求,輸出json對(duì)象 HttpAdapter.printlnObject(response, map); }else{ //如果接收的callback值不為null,則是跨域請(qǐng)求,輸出跨域的json對(duì)象 HttpAdapter.printlnJSONPObject(response, map, callback); } } 2.HttpAdapter.java(輸出對(duì)象的java文件),printlnObject方法打印正常json字符串;printlnJSONObject方法對(duì)json字符串進(jìn)行了特殊處理。
/** * 打印對(duì)象 * @param response * @param object */ public static void printlnObject(HttpServletResponse response,Object object){ PrintWriter writer=getWriter(response); writer.println(JSON.toJSONString(object)); } /** * 打印跨域?qū)ο? * @param response * @param object */ public static void printlnJSONPObject(HttpServletResponse response,Object object,String callback){ PrintWriter writer=getWriter(response); writer.println(callback+"("+JSON.toJSONString(object)+")"); }
新聞熱點(diǎn)
疑難解答
圖片精選