Spring MVC jsonp跨域呼叫 中文亂碼問題處理
阿新 • • 發佈:2018-12-22
一、問題描述
最近專案中使用了Spring MVC開發了一個api介面伺服器,介面呼叫要求需支援jsonp跨域形式呼叫。在自己開發和測試過程中未發現有中文亂碼問題,因為是在瀏覽器中直接輸入url方式進行呼叫,應答回來的都是正常的中文;但當前端呼叫介面使用時,就出現中文亂碼問題了。
二、問題分析
經過查閱資料後,大致明白了問題所在,jsonp跨域介面的寫法和json完全不一樣,jsonp返回的是一個JSONPObject物件,而非json格式字串。
三、處理說明
1.由於需要相容兩種呼叫方式,所以決定統一應答json格式的字串
/** * 測試介面 * @param request * @return */ @RequestMapping(value = "/fault/test", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE + CHARSET) @ResponseBody private String testPort(HttpServletRequest request){ CommonRes res=new CommonRes(); String callback=null; try { //引數獲取 callback=request.getParameter("callback"); //業務邏輯處理 } catch (Exception e) { logger.warn("介面處理異常", e); res.setAcktype(CommonRes.RC_EXECUTE_FAIL); } return jsonp(callback,res); }
2.jsonp相容處理,如果有傳callback引數,則先以callback和應答結果物件為引數建立JSONPObject物件,再轉成json字串;否則直接將應答結果物件裝成json字串。
3.完成上面步驟後,可以實現兩種呼叫方式相容,但jsonp還是會亂碼,需在@RequestMapping處新增produces = MediaType.APPLICATION_JSON_VALUE + CHARSET,CHARSET值為/** * 回撥應答 * @param callback * @param o * @return */ protected String jsonp(String callback,Object o){ String res; if(callback!=null && !"".equals(callback)){ res= jsonSerializerUtil.seriazileAsString(new JSONPObject(callback,o)); }else{ res= jsonSerializerUtil.seriazileAsString(o); } return res; }
protected final static String CHARSET = ";charset=UTF-8";
4.這樣就可以實現兩種方式呼叫都正常。