ajax跨域请求

来源:互联网 发布:ubuntu重启网络管理 编辑:程序博客网 时间:2024/04/30 11:53
ajax跨域请求
有时候公司的两个项目之间要进行联动操作,这时候就涉及的跨域,
为什么是不能像正常的请求一样请求的数据呢,这是因为浏览器有安全限制,服务器端是不存在跨域安全限制的,所以通过本机服务器端通过类似httpclient方式完成“跨域访问”的工作,浏览器端的真正跨域访问,推荐的是目前jQuery $.ajax()支持get方式的跨域,这其实是采用jsonp的方式来完成的.
$.ajax({   async:false,   url: http://地址,   type: "GET",   dataType: 'jsonp',   jsonp: 'jsoncallback',   data: qsData,   timeout: 5000,   beforeSend: function(){   //jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了   },   success: function (json) {//客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数    if(json.actionErrors.length!=0){           alert(json.actionErrors);     }       genDynamicContent(qsData,type,json);   },    complete: function(XMLHttpRequest, textStatus){    $.unblockUI({ fadeOut: 10 });   },   error: function(xhr){    //jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了    //请求出错处理    alert("请求出错(请检查相关度网络状况.)");   }});

SpringMVC后台,请求中添加参数String jsonCallback
@RequestMapping("/getJsonp")public void list_ajax(Integer id,String jsonCallback,HttpServletRequest request,HttpServletResponse response) {String jsonResult = JSONObject.fromObject(page).toString();if (jsonCallback!=null && !"".equals(jsonCallback)) {jsonResult = jsonCallback+"("+jsonResult+")";}}



jsonp的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了.

JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。

jsonCallback 函数jsonp1236827957501(....): 是浏览器客户端注册的,获取跨域服务器上的json数据后,回调的函数

Jsonp原理:

首先在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)传给服务器。注意:服务端得到callback的数值后,要用jsonp1236827957501(......)把将要输出的json内容包括起来,此时,服务器生成 json 数据才能被客户端正确接收。

然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 'jsoncallback'的值 jsonp1236827957501 .

最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。

客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时javascript文档数据,作为参数,
传入到了客户端预先定义好的 callback 函数(如上例中jquery $.ajax()方法封装的的success: function (json))里.(动态执行回调函数)

可以说jsonp的方式原理上和<script src="http://跨域/...xx.js"></script>是一致的(qq空间就是大量采用这种方式来实现跨域数据交换的) .JSONP是一种脚本注入(Script Injection)行为,所以也有一定的安全隐患.


注意,jquey是不支持post方式跨域的.

为什么浏览器安全限制了跨域呢?
因为为了防止CSRF攻击(跨站请求伪造)
意思是,你访问正常的A网站正常用户名密码进入后,会留下cookie信息,这时候你又访问了危险网站B,B网站就用你的cookie信息发送请求,这样就造成了,你的信息泄露,或者钱物损失,
进行CSRF防御
使用令牌机制,先在后台生成token令牌,然后放到表单的隐藏域里面,请求到后台的时候再验证token,就可以防御CSRF攻击



0 0
原创粉丝点击