Spring MVC jsonp跨域调用 中文乱码问题处理

来源:互联网 发布:有4g流量 2g网络扣费 编辑:程序博客网 时间:2024/05/14 01:48

一、问题描述

    

           最近项目中使用了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.这样就可以实现两种方式调用都正常。




0 0