1. 程式人生 > >Spring MVC jsonp跨域呼叫 中文亂碼問題處理

Spring MVC jsonp跨域呼叫 中文亂碼問題處理

一、問題描述

最近專案中使用了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字串。

/**
     * 回撥應答
     * @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;
    }
3.完成上面步驟後,可以實現兩種呼叫方式相容,但jsonp還是會亂碼,需在@RequestMapping處新增produces = MediaType.APPLICATION_JSON_VALUE + CHARSET,CHARSET值為
protected final static String CHARSET = ";charset=UTF-8";

4.這樣就可以實現兩種方式呼叫都正常。