Ajax以及跨域处理

哈哈哈,终于写到最后一章了。不过也还没有结束,说,不要为了学习而学习,恩。我是为了好好学习而学习呀。哈哈哈。正在尝试爱上代码,虽然有一丢丢的难,不过,我相信我会的!

【Ajax】

Ajax技术的核心是XMLHttpRequest对象(简称HXR)。Ajax通信与数据格式无关,这种技术就是无须刷新页面即可从服务器取得数据,但不一定是XML数据。

【XMLHttpRequest对象】

IE5是第一款引入XHR对象的浏览器。XHR对象是通过MSXML库中的一个ActiveX对象实现的。在IE5中,可能会遇到MSXML2.XMLHttp、MSXML2.XMLHttp.3.0、MSXML2.XMLHttp.6.0这三种版本的XHR对象。

XHR的用法

在使用XHR对象时,要调用的第一个方法是open(),他接收三个参数:要发送的请求类型("get"、"post"等)、请求的URL和表示是否异步发送请求的布尔值。

XHR对象的属性

responseText:作为响应主体被返回的文本。

responseXML:如果响应的内容类型是"text/xml"或"application/xml",这个属性中将保存包含着响应数据的XML DOM文档。

status:响应HTTP状态。

statusText:HTTP状态说明。

HTTP头部信息

http是计算机通过网络进行通信的规则。

http请求过程:

(1)建立TCP连接

(2)web浏览器向web服务器发送请求命令。

(3)web浏览器发送请求头信息。

(4)web服务器应答。

(5)web服务器发送应答头信息。

(6)web服务器向浏览器发送数据。

(7)web服务器关闭TCP连接。

http请求组成:

(1)http请求的组成和方法,比如get或者post请求;

(2)正在请求的URL;

(3)请求头,包含客户端环境信息,身份验证信息等;

(4)请求体,也就是请求正文。可以包含客户提交的查询字符串信息、表单信息等等。

get请求和post请求

get:一般用于信息获取,使用传递参数,对所发送信息的数量也有限制,一般在2000个字符。

  get请求经常会发生一个错误,就是查询字符串的格式有问题。查询字符串中每个参数的名称和值都必须使用encodeURICompent()进行编码,然后才能放到URL末尾;而且         对所有名-值对儿都必须由和号(&)分隔。

post:通常用于向服务器发送应该被保存的数据,一般用于修改服务器上的的资源,对所发信息的数量无限制。

与get请求相比,post请求消耗的资源会更多一些。从性能角度来看,以发送相同的数据计,get请求的速度最多可达到post请求的两倍。

【XMLHttpRequest2级】

FromData

为序列化表单以及创建与表单以及创建与表单格式相同的数据(用于通过XHR传输)提供了便利。如下创建了一个FromData对象,并添加了一些数据:

var data=new FromData();
data.append("name","Nicholas");

这个append()方法接受两个参数:建和值,分别对应表单字段的名字和字段中包含的值。

使用FromData生物方便之处体现在不明确地在XHR对象上设置请求头部。XHR对象能够识别传入的数据类型是FromData实例,并配置适当的头部信息。

超时设定

IE8为XHR对象添加了一个属性timeout,表示请求在等待响应多少毫秒之后就终止。在给timeout设置一个值后,如果在规定的时间内浏览器还没有接受响应,那么就会触发timeout事件,进而调用ontimeouts事件处理程序。

overrideMimeType()方法:用于重写XHR响应的MIME类型。

【跨源资源共享】

默认情况下,XHR对象只能访问与包含它的页面位于同一域中的资源。CORS(跨源资源共享)定义了必须访问跨源资源时,浏览器与服务器应该如何沟通。CORS背后的基本思想,就是自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或相应是应该成功还是失败。

IE对CORS的实现

微软在IE8中引入了XDR类型,这个对象与XHR类似,但能实现安全可靠的跨域通信。XDR对象安全机制部分实现了W3C和CORS规范。

所有XDR请求都是异步执行的,不能用它来创建同步请求。请求返回后,会触发load事件,响应的数据也会保存在responseText属性中。如下:

var xdr=new XDomainRequest();
xdr.onload=function(){
alert(xdr.responseText);
};
xdr.open("get","http://www.somewhere-else.com/page/");
xdr.send(null);

【其他跨域技术】

图像Ping

动态创建图像经常用于图像Ping。图像Ping是与服务器进行简单、单向的跨域通信的一种方式。

图像Ping最常用于跟踪用户点击页面或动态广告曝光次数。图像Ping主要有两个缺点,一是只能发送get请求,二是无法访问服务器的响应文本。

JSONP

JSONP是JSON with padding(填充式JSON或参数式JSON)的简写。JSONP与JSON差不多,只不过是被包含在函数调用中的JSON。如下:

callback ({"name":"Nicholas"});

JSON由回调函数和数据两部分组成。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般在请求中指定的,而数据就是传入回调函数中的JSON数据。如下:

http://freegroip.net/json/?callback=handleResponse

【Comet】

Comet指的是一种更高级的Ajax技术(经常也有人称作“服务器推送”)。Ajax是一种从页面向服务器请求数据的技术,而Comet则是一种服务器向页面推送数据的技术。

实现Comet的方式有两种,长轮询和流。

长轮询是传统轮询(即短轮询)的一个翻版,即浏览器定时向服务器发送请求,看有没有更新数据。长轮询吧短轮询颠倒了一下。页面发起一个到服务器的请求,然后服务器一直保持连接打开,直到有数据可发送。发送完数据之后,浏览器关闭连接,随即又发起一个到服务器的新请求。

HTTP流,流不同于轮询,因为他在页面的整个生命周期内只使用HTTP连接。具体而言,就是浏览器向服务器发送一个请求,而服务器保持连接打开,然后周期性地向浏览器发送数据。所有服务器端语言都支持打印到输出缓存然后刷新(将输出缓存中的内容一次性全部发送到客户端)的功能,也正是实现HTTP流的关键所在。

JavaScript(10)——Ajax以及跨域处理的更多相关文章

  1. javascript ajax 脚本跨域调用全解析

    javascript ajax 脚本跨域调用全解析 今天终于有点时间研究了一下javsscript ajax 脚本跨域调用的问题,先在网上随便搜了一下找到一些解决的办法,但是都比较复杂.由是转到jqu ...

  2. jquery中ajax处理跨域的三大方式

    一.处理跨域的方式: 1.代理 2.XHR2 HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已经实现了跨域访问.但ie10以下不支持 只需要在服务端填上响应头: ? 1 2 ...

  3. AJAX POST&跨域 解决方案 - CORS

    一晃又到新年了,于是开始着手好好整理下自己的文档,顺便把一些自认为有意义的放在博客上,记录成点的点滴.          跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是 ...

  4. 解决Ajax不能跨域的方法

    1.  Ajax不能跨域请求的原因 同源策略(Same Origin Policy),是一种约定,该约定阻止当前脚本获取或者操作另一个域下的内容.所有支持Javascript的浏览器都支持同源策略,也 ...

  5. AJAX POST&跨域 解决方案 - CORS(转载)

    跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免 ...

  6. ajax实现跨域访问

    ajax跨域访问是一个老生畅谈的问题啦,网上解决方法很多,discuz用的p3p协议,有兴趣的朋友可以了解下,比较常用的是JSONP方法,貌似目前这种方法只支持GET方式,不如POST方式安全. 即使 ...

  7. Ajax之跨域访问与JSONP

    前言 同源策略的限制,使得ajax无法发出跨域请求.在许多情况下,我们需要让ajax支持跨域.以下是其中一种解决方案(JSONP).JSONP解决了跨域数据访问的问题. 在html中,具有src属性的 ...

  8. Ajax之跨域请求

    一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径‘http://127.0.0.1:8000/index/’,对应的视图是index视图返回一个inde ...

  9. jQuery ajax 302跨域

    一.ajax 302 ajax用于异步获取服务器数据,但是某天有这么一个使用场景: > 基于安全考虑,登录的用户的信息失效时,系统的所有ajax接口都由服务器直接重定向到系统的登录页面,此时登录 ...

随机推荐

  1. linode更换Linux内核教程(独家)

    Linode服务器性价比高,最低套餐2G内存,享受每月2TB流量,机房40Gb带宽,每月供需10美元(Linode优惠链接).Linode用户创建vps服务器后,可在后台自定义Linux系统版本,包括 ...

  2. linux ll命令参数的详解

    用法:ls [选项]... [文件]... 列出 FILE 的信息(默认为当前目录). 如果不指定-cftuvSUX 或--sort 选项,则根据字母大小排序. 长选项必须使用的参数对于短选项时也是必 ...

  3. C# 正则表达式 结合 委托

    使用正则表达式匹配字符串的同时,使用委托事件,处理每一个匹配项 示例代码: string msg = "我的邮箱是zxh@itcast.cn的邮箱是yzk365@chezhihui.com减 ...

  4. 解决larave-dompdf中文字体显示问题

    1.安装laravel-dompdf依赖. Packagist:https://packagist.org/packages/barryvdh/laravel-dompdf composer requ ...

  5. linux内存管理(repost)

    一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得 ...

  6. C# XML配置文件读写类(用于程序配置保存)

    调用方式 //初始化并指定文件路径 XmlConfigUtil util = new XmlConfigUtil("C:\\1.xml"); //写入要保存的值以及路径(Syste ...

  7. jfinal获取服务器的IP和端口

    String serverIp = getRequest().getServerName(); Integer serverPort = getRequest().getServerPort();

  8. $(#form :input)与$(#form input)的区别

    相信大家都很奇怪这两者的区别 我从两个方面简单介绍下 1. $("form :input") 返回form中的所有表单对象,包括textarea.select.button等    ...

  9. java泛型操作复习,以及讲解在android中使用的场景

    android使用泛型的地方很多,比如集成自BaseAdapter实现封装的Adapter,对常用操作进行封装,但是需要对传进来的数据进行处理,此时就使用到泛型,示例如下: public abstra ...

  10. ACdream 1020 The Game about KILL

    找规律. 11 3 1 3 5 7 1 3 5 7 9 11 13 15 ....... #pragma comment(linker, "/STACK:1024000000,1024000 ...