AJAX机制详解以及跨域通信

最近做的一个项目中需要ajax跨域取得数据,中间出了点小差错,于是把ajax复习一下,记录下来关于跨域的问题的要点,分享给大家

1.Ajax

1.1.Ajax简介
  Ajax简介这一部分我们主要是谈一下ajax的起源,ajax是什么?因为这些是跟技术无关的。所以,大多细节都是一笔带过。

  Ajax的起源?

  Ajax一词源于2005年 Jesse James Garrett发表的一篇题为”Ajax:A new Approach to Web Applications”.他在这篇文       章中介绍了一种新技术,用他的话说,就是Ajax :Asynchronous JavaScript +XML的缩写。

  Ajax是什么?

  这种新技术的主要目的就是为了使前端网页能够向服务器请求额外的数据而不需要卸载页面。自从这种技术出现以后,微软率先引入XHRt对象(ajax能够实现的核心对象),然后其他浏览器相继实现这种技术。总而言之,ajax就是一种能异步通信的技术。

1.2.Ajax的核心对象—XMLHttpRequest
  因为IE5是最先引入这个XHR对象的,当时并没有事实上的标准。在IE中有三种不同的XHR对象版本:MSXML2.XMLHttp,MSXML2.XMLHttp.3.0和MSXML2.XMLHttp.6.0;

根据这三种版本号,在IE中创建一个XHR对象如下:

function createXHR() { //IE7之前的版本通过这种方式  var versions = [    'MSXML2.XMLHttp',    'MSXML2.XMLHttp.3.0',    'MSXML2.XMLHttp.6.0'  ];  var xhr = null;  for (var item in versions) {    try {      xhr = new ActiveXObject(item); //若不存在该版本,可能会出错      if (xhr) break;    } catch (e) {      //一般对这种错误不做处理    }  }  return xhr;}

登录后复制

在IE引入这个对象之后,其他浏览器厂商也相继跟随,这时候XHR对象成为事实上的标准!

跨浏览器创建XHR对象;

function createXHttpRequest() {  if (typeof XMLHttpRequest !== 'undefined') { //不要用 if(XMLHttpRequest){}这种形式,    return new XMLHttpRequest();              //如果是这种形式在找不到XMLHttpRequest函数的情况下,会报错。} else if (typeof ActiveXObject !== 'undefined') {          return createXHR(); //用到刚才我们创建的函数   } else { throw new Error('不能创建XMLHttpRequest对象'); } }

登录后复制

1.2.XMLHttpRequest的用法
XMLHttpRequest对象的函数有6个:

open("method",url,boolean);              //该方法的三个参数,分别为----提交方式"get"或者"post"等                 //&& url是相对于执行代码的当前页面的路径(使用绝对路径是允许的)&&是否异步 send();               //这个方法接收一个参数,这个参数是作为请求主体发送的数据,            //说明: 如果有参数,请使用post方式提交 使用方式如下,send("user="+username+"&pwd="+password);           //如果没有参数,为了兼容性考虑,必须在参数中传入null,即send(null);该方式使用get方式提交abort();       //取消当前响应,关闭连接并且结束任何未决的网络活动。          //这个方法把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,并且取消所有未决             //的网络活动。例如,如果请求用了太长时间,而且响应不再必要的时候,可以调用这个方法。getResponseHeader()             //返回指定的 HTTP 响应头部的值。其参数是要返回的 HTTP 响应头部的名称。可以使用任             //何大小写来制定这个头部名字,和响应头部的比较是不区分大小写的。          //该方法的返回值是指定的 HTTP 响应头部的值,如果没有接收到这个头部或者 readyStat             //e 小于 3 则为空字符串。如果接收到多个有指定名称的头部,这个头部的值被连接起来并             //返回,使用逗号和空格分隔开各个头部的值。getAllResponseHeaders()                 //把 HTTP 响应头部作为未解析的字符串返回。          //如果 readyState 小于 3,这个方法返回 null。否则,它返回服务器发送的所有 HTTP 响应的          //头部。头部作为单个的字符串返回,一行一个头部。每行用换行符 "" 隔开。setRequestHeader()         //向一个打开但未发送的请求设置或添加一个 HTTP 请求。

登录后复制

  XMLHttpRequest对象的属性有5个:

属性 描述
responseText 作为响应主题被返回的文本
responseXML 如果相响应的是text/html或者application/xml类型的话,这个属性将保存着响应的XML文档
status http的响应状态码
statusText http状态的说明
readyState XMLHttpRequest对象的状态位 0 1 2 3 4 分别表示5种状态
timeout 设置超时时间,单位是ms.目前只有IE8+支持—尚未标准化(不推荐使用)

  XMLHttpRequest对象的事件属性onReadyStateChange:—–所有浏览器兼容

  该属性监听的是  XMLHttpRequest对象的readyState属性的变化:

  readyState的变化分别对应如下状态:

  0:尚未初始化。未调用open()之前

  1:启动。调用open()之后,但是未调用send();

  2:发送。调用send()但是尚未得到响应。

  3:正在接收数据。刚接收到响应数据开始到接收完成之前。

  4: 完成。数据接收完成。

xhr.onreadystatechange = function () { if (xhr.readyState == 4) {  if (xhr.status >= 200 && xhr.status 
XMLHttpRequest对象的事件属性ontimeout -----仅限IE8+,不过最新的主流高版本浏览器也已经实现(不推荐使用)xhr.timeout=1000;//一秒钟xhr.ontimeout=functon(){  //处理代码  ......}

登录后复制

  这种使用方式有个问题需要注意,就是在超时之后,在接收到数据后仍然会触发onreadystatechange事件,如果在处理onreadychange事件时访问xhr.status属性,会出错。所以我们在访问该属性时需要做一下try{}catch处理。但是,因为这个属性暂不兼容,所有我们就不重点讲了。

XMLHttpRequest对象的事件属性onload onerror onloadstar onbort onprogress:

                                                                                                   -----非IE浏览器和IE 10+已实现

       onload在IE8以上可以实现,大部分事件根据readySate变化均可以实现,以上事件只不过是方便使用而已。

  onload和onprogress 这两种事件分别对应着readyState=4和readyState=3的情况,使用方式分别如下:

   xhr.onload= function (event) {      //event只包含一个属性 event.target=xhr;使用方式只是在readyState=4时差不多..    }   xhr.onprogress=function(event){     //event除了包含event.target=xhr之外,还包含三种属性     //lengthComputale(进度信息是否可用),position(已接受字节数)和totalSize(总字节数).        }

登录后复制

补充:有些事件均可以根据readyState的状态进行模拟。只有有的浏览器进行了方便化处理而已。  

3.单向跨域技术 ---CORS
 今天我们这里讲的是客户端网页向不在同一个域的服务器请求数据..客户端在收到返回的数据时时,用回调函数处理数据。

即:

 1. 客户端向域外服务器请求数据

 2.服务器得到响应后向客户端发送数据。

 3.客户端根据返回的数据执行回调函数.

 我知道不同域下的iframe也可以进行通信,而且这也是一种跨域通信技术。但是,这种iframe页面之间的双向通信,我们在下一个专题里面讲解,今天主要讲的是单向通信。

3.1.CORS跨域请求的原理
在用xhr(XMLHttpRequest)对象或者xdr(XDomainRequest)对象,发送域外请求时,大概的实现原理如下图:

 3.2.IE中CORS技术的实现
 IE8引入了一个XDR类型,这个类型与XHR基本类似,但是其能实现安全可靠地跨域通信。

 XHD的特点:

 1.cookie不会随请求发送,也不会随响应返回。

 2.只能设置请求头部中的Content-Type片段。

 3.不能访问响应头部信息。

 4.只是支持get和post请求。

 XDR支持onload和onerror事件属性,且其使用方式和XHR基本一致,不过其open()只接收两个参数,默认是异步的。

var xdr = new XDomainRequest();xdr.onload = function () { //处理xdr.responseText}xdr.onerror = function () {};xdr.open('get', '绝对url');xhr.send(null);

登录后复制

3.3.跨浏览器的CORS技术实现

在标准浏览器中XHR对象就已经可以自动实现跨域请求,但是XHR和XDR的不同之处:

1.XHR可以在设置 withCredentials =true时,浏览器会把cookie发送给服务器,服务器此时通过设置头部Access-Control-Allow-Credentials:true时来响应。如果,服务器不设置这个属性,则浏览器会触发onerror事件。

2.在回调函数中可以访问status和statusText属性,而且支持同步请求。

 以下是实现跨域请求的代码:

function createCrosRequest(method, url) { var xhr = new XMLHttpRequest(); //IE7+ if ('withCredentials' in xhr) { //IE8-IE9浏览器没有这个属性  xhr.open(method, url, true); } else if (typeof XDomainRequest != 'undefined') {  xhr = new XDomainRequest();  //IE  xhr.open(method, url) } return xhr;}var request=CreateCrosRequest("get","url");if(request){ request.onload=function(){ //处理request.responseText; } request.send(null);}

登录后复制

4.单向跨域技术 ---JSONP技术

 JSONP技术比较简单,其主要原理主要是利用script标签的特性。

 script标签和image标签一样,它们都具有src属性,而且这个属性是可跨域的。

因为script标签返回的都是js代码,且该js代码会自动执行。所以,如果我们请求返回的数据也是类似一段js代码的形式,岂不是就可以实现在脚本加载完毕后自动执行。

如果我们的请求,返回的数据是 callback + '(' + json + ')'; 这种形式的数据, 那么在脚本加载完毕之后也就能自动执行callback()函数了.

4.1.客户端写法

nbsp;html>        window.onload=function(){    var button=document.getElementById("ibutton");    function callback(data){      //处理data    }    button.onclick=function(){      var script=document.createElement("script");      script="http://www.sasd.com/json/?callbak=callback";       document.body.insertBefore(script,document.body.firstChild);//加载脚本          }      }

登录后复制

   1.客户端将回调函数名写入脚本的url参数中。

   2.script加载的时候会发送跨域请求。

4.2.服务器端

 1.通过url得到函数名,命名为callback

 2.将请求的数据作为函数的参数格式转化json格式,命名为。

 3.将返回结果拼接为 callback+"("+json+")"; --------返回的就是填充式的数据,这段数据在脚本中会自动执行。

 4.返回数据.

 4.3.JSONP技术的缺点

 1.因为是通过url传参数,所以请求只能是get类型的。

 2.目前只有onload属性事件,onerror还没有统一化,如果加载脚本出错,客户端很难得到反馈。

 3.所请求数据的站点必须是可信任的,如果返回的数据段中注入的有恶意的代码,危害较大,且难以发现。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

Django框架如何使用ajax的post方法

JQuery ajax 返回json时出现中文乱码该如何解决

如何解决JQuery ajaxSubmit提交中文乱码

以上就是AJAX机制详解以及跨域通信的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2757445.html

(0)
上一篇 2025年3月8日 07:56:19
下一篇 2025年2月18日 08:04:58

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • AJAX简单异步通信实例分析

    这篇文章主要介绍了ajax简单异步通信,实例分析了ajax异步通信的技巧与相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了AJAX简单异步通信的方法。分享给大家供大家参考。具体分析如下: 客户端:向服务器发出一个空请…

    编程技术 2025年3月8日
    200
  • AJAX对服务器返回XML的处理方法

    这篇文章主要介绍了ajax对服务器返回xml的处理方法,实例分析了ajax的实现技巧及针对xml返回数据的处理方法,需要的朋友可以参考下 本文实例讲述了AJAX对服务器返回XML的处理方法。分享给大家供大家参考。具体分析如下: 在AJAX …

    编程技术 2025年3月8日
    200
  • JavaScript基于Ajax实现不刷新在网页上动态显示文件内容

    这篇文章主要介绍了javascript基于ajax实现不刷新在网页上动态显示文件内容,可实现实时显示服务器上txt文件内容的功能,是ajax基本应用,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了JavaScript基于Ajax…

    编程技术 2025年3月8日
    200
  • 使用ajax实现无刷新改变页面内容和地址栏URL

    本文主要详细介绍了使用ajax和window.history.pushstate无刷新改变页面内容和地址栏url的方法,需要的朋友可以参考下 在访问现在很火的google plus时,细心的用户也许会发现页面之间的点击是通过ajax异步请求…

    编程技术 2025年3月8日
    200
  • 解决ajax跨域请求数据cookie丢失问题

    本文主要是从前端jquery和服务端php为例,分别使用实例解决ajax跨域请求数据cookie丢失问题,推荐给有相同需求的小伙伴们。 前端: 以jquery为例: 需要加入 xhrFields: {            withCred…

    编程技术 2025年3月8日
    200
  • Ajax核心XMLHttpRequest总结

    本文主要是给大家总结了一下ajax的核心内容xmlhttprequest的相关知识,十分的详细,推荐给大家,需要的小伙伴参考下。 Ajax:即”Asynchronous JavaScript and XML”(异步J…

    编程技术 2025年3月8日
    200
  • 浅谈Ajax的缓存机制

    本文主要是向我们简单介绍了ajax的缓存机制的几条简单的规则以及注意事项,非常不错,这里推荐给大家。 Ajax的缓存机制和浏览器处理资源时的缓存机制是一样的。 三条简单规则: 只要是URL相同的GET请求,浏览器会使用缓存(当然还要看服务器…

    编程技术 2025年3月8日
    200
  • 服务端配置实现AJAX跨域请求

    这篇文章主要介绍了服务端配置实现ajax跨域请求的相关资料,需要的朋友可以参考下 一直以为AJAX跨域是无法逾越的鸿沟,最近发现原来在服务端可以通过发送header信息来允许AJAX跨域请求。 PHP代码示例: header(‘Access…

    编程技术 2025年3月8日
    200
  • ajax的get请求时缓存处理解决方法

    这篇文章主要介绍了ajax的get请求时缓存处理解决方法,详细分析了常见的四种解决方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了ajax的get请求时缓存处理解决方法。分享给大家供大家参考。具体分析如下: 很多时候在Ajax的…

    编程技术 2025年3月8日
    200
  • 零基础学习AJAX之制作自动校验的表单

    这篇文章主要介绍了零基础学习ajax之制作自动校验的表单,需要的朋友可以参考下 传统网页在注册时检测用户名是否被占用,传统的校验显然缓慢笨拙。 当ajax出现后,这种体验有了很大的改观,因为在用户填写表单时,签名的表单项已经发送给了服务器,…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论