ajax跨域请求

一、什么是跨域请求
域名http://www.baidu:8080/script/jquery.js,它由http://(协议)、www(子域名)、baidu(主域名)以及8080(端口号)组成,当另一个域名与其中任意一项对应不等的话,那么我们说两个域名就是跨域的。
如http://www.baidu:8080的页面上我们要请求数据到http://www.sohu:8080上去,那么就说这种请求是跨域请求。

二、为什么要讲跨域请求
因为在一般的请求条件下,我们的请求都是访问到原有服务。当服务有分开的时候,就必然会使用跨域请求。如果用原有的请求方式去请求跨域域名,请求是不能成功发送到后台。因此,对于ajax跨域请求有独特的方法使用。

三、json和jsonp
web开发很多时候都会用到json数据,那jsonp是干嘛的?jsonp是ajax提供的一种跨域请求实现的方式。首先我们看一下json和jsonp的数据格式
json

1
2
3
4
5
{
     "message" : "获取成功" ,
     "state" : "1" ,
     "result" :{ "name" : "工作组1" , "id" :1, "description" : "11" }
}

jsonp

1
2
3
4
5
callback({
     "message" : "获取成功" ,
     "state" : "1" ,
     "result" :{ "name" : "工作组1" , "id" :1, "description" : "11" }
})

大家发现,jsonp其实就是callback(json)。

四、如何使用jsonp进行跨域访问
例:
页面js请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$(document).ready( function (){
    +"?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);
  }});
});

后台接收数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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 ;
}

这样,就可以达到跨域请求的目的了,这里注意的是。因为我们ajax里面请求的数据格式是jsonp,那么返回的数据格式就是callback(json),如果直接返回json会报转换类型失败。

五、jQuery插件-jquery-jsonp
jQuery还提供了专门用于跨域请求的方法:

1
2
3
4
5
6
7
8
9
10
11
     + "?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);
   }
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值