使用springMVC和Jquery实现JSONP
JSONP这个东东是啥我就不写了,直接贴实现的代码
JAVA代码:
/** * * 查询用户是否已经提交认证获取已经是认证会员 * * 使用spring mvc的直接返回string会遇到分号转义后字符串不完整的问题 * @param userId * @param callback * @return * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ @RequestMapping("/queryAuthTaskStatus") @ResponseBody public void queryTaskStatus(@ModelAttribute(User.SESSION_USERID)String userId, String callback,PrintWriter out){ log.info("queryAuthTaskStatus:,user_id="+userId); Map<String,String> ret = new HashMap<>(); String code = null; String msg = null; if(StringUtils.isEmpty(userId)){ code = "-1"; msg = "用户未登陆"; }else{ try { UserVO user = userService.findInfoByUserId(Long.parseLong(userId)); if(xxx==yyy){ code = "1"; }else{ code = "0"; } } catch (NumberFormatException | InParamException e) { code = "-1"; msg = "查询用户信息异常"; log.error(e.getMessage(), e); } } ret.put("code", code); ret.put("msg", msg); String result = callback + "(" + new Gson().toJson(ret) +")"; out.write(result);
out.flush();
out.close();
}
之前使用直接返回String出现字符被截取掉了(原因未知),后改成使用PrintWriter对象直接输出。
JS代码:
$.ajax({ async:false, url: 'xxx/queryAuthTaskStatus.htm', type: "get", dataType: 'jsonp', jsonp: 'callback', success: function (data) { console.log(data); }, error: function (XMLHttpRequest, textStatus, errorThrown){ } });
Jquery文档描述:
jsonp String 在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。 jsonpCallback String 为jsonp请求指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。这主要用来让jQuery生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存GET请求的时候,指定这个回调函数名。
如果不用上门的JSONP代码调用,而是用普通调用,例如直接在浏览器敲:xxx/queryAuthTaskStatus.htm?userId=1&callback=callback,这个绿色是对应后台的参数名称,红色对应Jquery中的jsonp的值。
得到的结果:
callback({"code":"0"})
如果是jquery的jsonp请求代码将在console中看到:
{"code":"0"}
jsonp可以参考此blog:http://www.cnblogs.com/zichi/p/4593047.html