您的位置:首页 > 编程语言 > Java开发

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

2016-06-27 16:52 507 查看

一、问题描述

    

           最近项目中使用了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.这样就可以实现两种方式调用都正常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息