起因:

起因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统,共其他系统获取认证与授权信息,暂且称之为A系统;调用A系统以B为例。在B系统 中用ajax调用A系统系统的接口(数据格式为json),当时特别困惑,在A系统中访问相应的url可正常回返json数据,但是在B系统中使用 ajax请求同样的url则一点儿反应都没有,好像什么都没有发生一样。

jQuery的ajax有jsonp这样的属性可以用来解决跨域的问题。

由于不了解json和jsonp两种格式的区别,也犯了错误

首先来看看在页面中如何使用jQuery的ajax解决跨域问题的简单版:

 $(document).ready(function(){
var url='http://localhost:8080/WorkGroupManagment/open/getGroupById"
+"?id=1&callback=?';
$.ajax({
url:url,
dataType:'jsonp',
processData: false,
type:'get',
success:function(data){
alert(data.name);
},
error:function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}});
});

这样写是完全没有问题的,起先error的处理函数中仅仅是alert(“error”),为了进一步弄清楚是什么原因造成了错误,故将处理函数变 为上面的实现方式。最后一行alert使用为;parsererror。百思不得其解,继续google,最终还是在万能的stackoverflow找 到了答案,链接在这里。原因是jsonp的格式与json格式有着细微的差别,所以在server端的代码上稍稍有所不同。

比较一下json与jsonp格式的区别:

json格式:
 {
"message":"获取成功",
"state":"1",
"result":{"name":"工作组1","id":1,"description":"11"}
}
jsonp格式:
 callback({
"message":"获取成功",
"state":"1",
"result":{"name":"工作组1","id":1,"description":"11"}
})

看出来区别了吧,在url中callback传到后台的参数是神马callback就是神马,jsonp比json外面有多了一层,callback()。这样就知道怎么处理它了。于是修改后台代码。

后台java代码最终如下:

 @RequestMapping(value = "/getGroupById")
public String getGroupById(@RequestParam("id") Long id,
HttpServletRequest request, HttpServletResponse response)
throws IOException {
String callback = request.getParameter("callback");
ReturnObject result = null;
Group group = null;
try {
group = groupService.getGroupById(id);
result = new ReturnObject(group, "获取成功", Constants.RESULT_SUCCESS);
} catch (BusinessException e) {
e.printStackTrace();
result = new ReturnObject(group, "获取失败", Constants.RESULT_FAILED);
}
String json = JsonConverter.bean2Json(result);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.print(callback + "(" + json + ")");
return null;
}

注意这里需要先将查询结果转换我json格式,然后用参数callback在json外面再套一层,就变成了jsonp。指定数据类型为jsonp的ajax就可以做进一步处理了。

虽然这样解决了跨域问题,还是回顾下造成parsererror的原因。原因在于盲目的把json格式的数据当做jsonp格式的数据让ajax处理,造成了这个错误,此时server端代码是这样的:

 @RequestMapping(value = "/getGroupById")
@ResponseBody
public ReturnObject getGroupById(@RequestParam("id") Long id,
HttpServletRequest request, HttpServletResponse response){
String callback = request.getParameter("callback");
ReturnObject result = null;
Group group = null;
try {
group = groupService.getGroupById(id);
result = new ReturnObject(group, "获取成功", Constants.RESULT_SUCCESS);
} catch (BusinessException e) {
e.printStackTrace();
result = new ReturnObject(group, "获取失败", Constants.RESULT_FAILED);
}
return result;
}

至此解决ajax跨域问题的第一种方式就告一段落。

追加一种解决方式

追求永无止境,在google的过程中,无意中发现了一个专门用来解决跨域问题的jQuery插件-jquery-jsonp

有第一种方式的基础,使用jsonp插件也就比较简单了,server端代码无需任何改动。

来看一下如何使用jquery-jsonp插件解决跨域问题吧。

 var url="http://localhost:8080/WorkGroupManagment/open/getGroupById"
+"?id=1&callback=?";
$.jsonp({
"url": url,
"success": function(data) {
$("#current-group").text("当前工作组:"+data.result.name);
},
"error": function(d,msg) {
alert("Could not find user "+msg);
}
});

最新文章

  1. SQL Server 数据库的维护(一)__存储过程(procedure)
  2. [2015hdu多校联赛补题]hdu5372 Segment Game
  3. 【转】linux下如何查看某个软件 是否安装?安装路径在哪
  4. Http进行网络通信
  5. *IntelliJ idea创建创建Maven管理的Java Web项目
  6. Android Monkey
  7. IT忍者神龟之中的一个句sql语句——连接同一字段的全部值
  8. Web应用和RESTful架构
  9. [NOIp 2012]同余方程
  10. 按键精灵PC版<末日王者>
  11. 搭建vsftpd服务
  12. Alpha(8/10)
  13. Gradle sync failed: /Applications/Android Studio.app/Contents/gradle/gradle-2.14.1/lib/plugins/gradle-diagnostics-2.14.1.jar (No such file or directory) Consult IDE log for more details (Help | Sh
  14. 查看 Mac/Linux 某端口占用情况
  15. iOS-静态库,动态库,framework浅析(二)
  16. 一个 CPU 核 开多少个 线程 比较合适 ?
  17. PHP7添加opcache.so模块
  18. Timing wheel心跳机制
  19. U33405 纽约
  20. Android获取文件的MD5值

热门文章

  1. mysql EXPLAIN Join Types 手册解释 及数据实操
  2. OAuth2.0授权流程
  3. HDU 1087 Super Jumping! Jumping! Jumping! (LIS的最大和)
  4. awk中RS,ORS,FS,OFS区别与联系
  5. [luoguP1227] [JSOI2008]完美的对称(sort)
  6. leetcode之twosum
  7. hdu4514(非连通图的环判断与图中最长链)(树的直径)
  8. Hibernate 批处理(batch inserts, updates and deletes)
  9. captcha库报错"OSError: cannot open resource"
  10. 6572平台上关于wifi热点切换跳的坑