【JavaScript】跨源资源共享CORS和其他跨域技术(Comet、JSONP、SSE、Web Sockets)

通过XHR实现Ajax通信的一个主要限制,来源于跨域安全策略。默认情况下XHR对象只能访问与包含它的页面位于同一个域中的资源,这种安全策略可以预防某些恶意行为。但是,实现合理的跨域请求也是很重要的。

一、CORS跨源资源共享

CORS(Cross-Origin Resource Sharing),跨源资源共享,是W3C的一个工作草案,定义了在必须访问跨源资源时,浏览器与服务器该如何沟通。其背后的基本思想使用自定义的HTTP头部,让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是应该失败。

比如:一个简单的使用get或者post发送的请求,它没有自定义的头部,在发送该请求时,需要给它附加一个额外的Origin头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予响应。

1、IE对CORS的实现

IE8中引入了XDR(XDomainRequest)类型,这个对象与XHR类似,能够实现安全可靠的跨域通信。
XDR与XHR不同之处在于:
1. cookie不会岁请求发送,也不会随响应返回。
2. 智能设置请求头部信息中的 Content-Type字段
3. 不能访问响应头部信息
4. 只支持get和post请求

XDR使得CSRF(跨站点请求伪造)和XSS(跨站点脚本)的问题得到缓解。
XDR的使用与XHR相似。

1、创建XDR对象;
2、调用open()方法,这里open方法只有两个参数,因为所有XDR请求都是异步执行的;
3、调用send()方法。

在接收到响应后,只能访问响应的原始文本,没有办法确定响应的状态码。要检测错误,可以指定一个onerror事件处理程序

var xdr = new XDomainRequest();
xdr.onload = function () {
   
    alert(xdr.responseText);
};
xdr.onerror = function () {
    //错误处理程序
    alert("An error occurred.");
};
xdr.open("post","http://www.somewhert-else.com/page/");
xdr.contentType = "application/x-www-form-urlencoded";
xdr.send("name1=value1&name2=value2");

注:由于导致XDR请求失败的因素有很多,因此不要忘记通过onerror事件处理程序来捕获该事件

XDR与XHR一样,也支持timeout属性及ontimeout事件处理程序

2、其他浏览器对CORS的实现

Firefox3.5+/Safari4+/Chrome/iOS版Safari和Android平台中的WebKit都通过XMLHttpRequest对象实现了对CORS的原生支持。要请求位于另一个域中的资源,使用标准的XHR对象并在open()方法中传入绝对URL即可
与XDR不同,通过跨域XHR对象可以访问status和statusText属性,而且支持同步请求。其主要限制有:

1、不能使用setRequestHeader()设置头部信息
2、不能发送和接收cookie
3、调用getAllResponseHeaders()方法总

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值