实例:http://blog.csdn.net/hongweigg/article/details/39054403

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

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

在发送请求时,需要附加一个额外的Origin头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予响应。如:Origin:http://www.nczonline.net(如果是公共资源,可以返回“*”);

如果没有这个头部或者是有这个头部但源信息不匹配,浏览器就会驳回请求。注意,请求和响应都不包含cookie信息。

IE浏览器:

微软在IE8中引入了XDR实现安全可靠地跨域通信,XDR对象的安全机制部分实现了W3C的CORS规范。

XDR与XHR很相似,不同之处在于:

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

2、只能设置请求头部信息中的Content-Type字段。

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

4、只能支持GET和POST请求。

被请求的资源可以根据它认为合适的任意数据(用户代理、来源页面等)来决定是否设置Access-Control-Allow-Origin头部。作为请求的一部分,Origin头部的值表示请求的来源域,以便远程资源明确地识别XDR请求。

XDR对象的open()方法只接收两个参数:请求的类型和URL。所有的XDR请求都是异步执行的,不能用它来创建同步请求。请求返回之后,会触发load事件,响应的数据也会保存在responseText属性中。

在接收到响应后,只能访问响应的原始文本,没有办法确定响应的状态代码。而且,只有响应有效就会触发load事件。如果失败(包括响应中缺少Access-Control-Allow-Origin头部)就会触发error事件。除了错误本身之外,没有其他信息可用,因此唯一能够确定的就只有请求未成功了。鉴于导致XDR请求失败的因素很多,可以通过onerror事件处理程序来捕获该事件,否则,即使请求失败也不会有任何提示。

Firefox 3.5+、Safari 4+、Chrome:

这些浏览器请求位于领一个域中的资源,使用标准的XHR对象并在open()方法中传入绝对URL即可。

与IE中的XDR对象不同,通过跨域XHR对象可以访问status和statusText属性,而且还支持同步请求。跨域XHR对象也有一些限制,但是为了安全这些限制是必须的。

1、不能使用setRequestHeader()设置自定义头部。

2、不能发送和接收cookie。

3、调用getAllResponseHeaders()方法总会返回空字符串。

由于无论同源请求还是跨源请求都是用相同的接口。因此对于本地资源,最好使用相对URL,在访问远程资源时再使用绝对URL。这样做能消除歧义,避免出现限制访问头部或本地cookie信息等问题。

Preflighted Requests:

 

       CORS通过一种叫做Preflighted Requests的透明服务器验证机制支持开发人员使用自己的头部、GET或POST之外的方法,以及不同类型的主题内容。发送Preflighted Requests使用OPTIONS方法,发送下列头部:

1、Origin:与简单的请求相同。

2、Access-Control-Request-Method:请求自身使用的方法。

3、Access-Control-Request-Headers:(可选)自定义的头部信息,多个头部以逗号隔开。

服务器可以决定是否允许这种类型的请求。服务器通过在响应中发送如下头部与浏览器进行沟通。

1、Access-Control-Allow-Origin:与简单的请求相同。

2、Access-Control-Allow-Method:允许的方法,多个方法以逗号隔开。

3、Access-Control-Allow-Headers:允许的头部,多个头部以逗号隔开。

4、Access-Control-Max-Age:应该将这个Preflighted Requests缓存多长时间(以秒表示)。

Preflighted 请求结束后,结果将按照响应中指定的时间缓存起来。而为此付出的代价只是第一次发这种请求时会多一次HTTP请求。

带凭据的请求:

默认情况下跨源请求提供凭据(cookie、HTTP认证以及客户端SSL证明等)。通过withCredentials属性设置为true,可以指定某个请求应该发送凭据。如果服务器接受带凭据的请求,会用下面的HTTP头部来响应。

Access-Control-Allow-Credentials:true。

如果发送的是带凭据的请求,但服务器的响应中没有包含这个头部,那么浏览器就不会把响应交给Javascript(于是,responseText将是空字符串,status的值是0,而且会调用onerror()事件处理程序)。服务器也可以在Preflight响应中发送这个HTTP头部,表示允许源发送带凭据的请求。

CORS的兼容性:

即使浏览器对CORS的支持程度不一样,但是所有浏览器都支持简单的(非Preflight和不带凭据的)请求。检测是否存在withCredentials属性,就可以知道XHR是否支持CORS,再结合检测XDomainRequest对象是否存在,就可以兼顾所有的浏览器。

funtion createCORSRequest(method,url){
var xhr = new XMLHttpRequest();
if("withCredentials" in xhr){
xhr.open(method,url,true);
}else if(typeof XDomainRequest != "undefined"){
xhr = newXDomainRequest();
xhr.open(method,url);
}else{
xhr = null;
}
return xhr;
} var request = createCORSRequest("get",url)
if(request){
request.onload = function(){
//对request.responseText进行处理
};
request.send();
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Ajax:Cross-Origin Resource Sharing(转)的更多相关文章

  1. Node.js 【CORS(cross origin resource sharing) on ExpressJS之笔记】

    app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*" ...

  2. CORS (Cross Origin Resources Share) 跨域

    CORS 跨域 1 什么是跨域问题 基于安全考虑,浏览器会限制使用脚本发起任何跨域请求. 所谓的跨域请求,就是与当前页面的 http/ip/port 不一样的请求. 但在实际运用中,跨域获取数据的需求 ...

  3. Cross-origin resource sharing JSON with Padding 同源策略 JSONP 为什么form表单提交没有跨域问题,但ajax提交有跨域问题? XMLHttpRequest and the Fetch API follow the same-origin policy 预检请求(preflight request)

    https://zh.wikipedia.org/wiki/跨来源资源共享 跨来源资源共享(CORS)是一份浏览器技术的规范,提供了 Web 服务从不同域传来沙盒脚本的方法,以避开浏览器的同源策略[1 ...

  4. Ajax本地跨域问题 Cross origin requests are only supported for HTTP

    问题:打开本地html文件时,报错如下 Cross origin requests are only supported for protocol schemes: http, data,chrome ...

  5. Subresource Integrity,SRI,Cross-Origin Resource Sharing (CORS),子资源的完整性检查,Subresource Integrity checking,CORS,Ajax

    SRI https://code.jquery.com/ SRI是一种新的W3C规范,它允许Web开发人员,以确保托管在第三方服务器上的资源是没有被篡改的.SRI的使用,建议作为最佳实践,每当库从第三 ...

  6. Cross-Origin Resource Sharing协议介绍

    传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本.但是Javascript脚 ...

  7. 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  8. 跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  9. Cross-Origin Resource Sharing(CORS)详解,CORS详解,CORS原理分析

    Keywords CORS, 跨域,JS跨域调用,Ajax CORS 跨域,跨域详解,CORS跨域原理 Cross-Origin Resource Sharing详解 Cross-Origin Res ...

随机推荐

  1. 1:scrapy框架原理与环境搭设

    1:原理图: (*此图来自网络) 2:开发过程: 1)编写items.py,确定要抓取的关键字段名称 2)编写spider,确定发送request的形式以及对于response的处理 3)编写pipe ...

  2. SVN 密码破解,svn密码本地找回 忘记密码

    svn 密码被保存在本地文件中 C:\Users\[your computer name]\AppData\Roaming\Subversion\auth\svn.simple 文件下. 加密保存 到 ...

  3. 关于textView的字数限制

    在一个项目中遇到texteView的字数限制,在iOS7.0上,会出现崩溃.我在这里栽了一个大跟头,废话不多说,下面直接贴代码吧. - (void)textViewDidChange:(UITextV ...

  4. ios app开发步骤

    虽然开发一个app的任务看上去可能很艰巨,但是整个过程可以抽象成几个相对简单的步骤,下面这些步骤会在你开发第一个app时帮你步入正途. 定义Concept 每个好app都是从一个concept开始. ...

  5. POJ3641 Pseudoprime numbers(快速幂+素数判断)

    POJ3641 Pseudoprime numbers p是Pseudoprime numbers的条件: p是合数,(p^a)%p=a;所以首先要进行素数判断,再快速幂. 此题是大白P122 Car ...

  6. 使用inline-block做水平垂直居中

    父级宽高不定,如何使子元素水平垂直居中? 下面是用 display: inline-block 实现的: <!doctype html> <html lang="en&qu ...

  7. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

  8. IOS单例模式(Singleton)

    IOS单例模式(Singleton)   单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...

  9. (摘)oracle dataguard切换

    众所周知,Data Guard已经是现今标准的主流容灾方案,由于日志传递对于网络适应程度强,且可以采用同步实时的传递方式和异步延迟的传递方式,甚至可以成为远程的异地容灾方案.不管用于何种用途,DG都免 ...

  10. CentOS下Qt窗口透明效果失效,成黑色背景的问题

    一.问题 Linux系统下Qt窗口的透明效果成了黑色,但同样的代码在windows机子上有透明效果,主要是修改系统的配置,仅在centos6.3及其以上版本实验过.其他系统可以相应配置. 二.问题运行 ...