Ajax:Cross-Origin Resource Sharing(转)
实例: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(转)的更多相关文章
- Node.js 【CORS(cross origin resource sharing) on ExpressJS之笔记】
app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*" ...
- CORS (Cross Origin Resources Share) 跨域
CORS 跨域 1 什么是跨域问题 基于安全考虑,浏览器会限制使用脚本发起任何跨域请求. 所谓的跨域请求,就是与当前页面的 http/ip/port 不一样的请求. 但在实际运用中,跨域获取数据的需求 ...
- 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 ...
- Ajax本地跨域问题 Cross origin requests are only supported for HTTP
问题:打开本地html文件时,报错如下 Cross origin requests are only supported for protocol schemes: http, data,chrome ...
- Subresource Integrity,SRI,Cross-Origin Resource Sharing (CORS),子资源的完整性检查,Subresource Integrity checking,CORS,Ajax
SRI https://code.jquery.com/ SRI是一种新的W3C规范,它允许Web开发人员,以确保托管在第三方服务器上的资源是没有被篡改的.SRI的使用,建议作为最佳实践,每当库从第三 ...
- Cross-Origin Resource Sharing协议介绍
传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本.但是Javascript脚 ...
- 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...
- 跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享
在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...
- Cross-Origin Resource Sharing(CORS)详解,CORS详解,CORS原理分析
Keywords CORS, 跨域,JS跨域调用,Ajax CORS 跨域,跨域详解,CORS跨域原理 Cross-Origin Resource Sharing详解 Cross-Origin Res ...
随机推荐
- zookeeper初体验之关于解决quartz重复执行任务的一种思路
前阵子工作中遇到了一个很麻烦的问题.本人所在的项目组做了一个机遇quartz集群的任务系统.通俗点讲就是用quartz框架(quartz是一款能跑定时任务的框架支持复杂的时间表达式)来执行定时任务.但 ...
- [Mugeda HTML5技术教程之3] Hello World: 第一个Mugeda动画
今天我们开始我们的第一个Mugeda动画作品,并通过它来看看制作Mugeda动画的一些通用流程.在开始制作之前,请确保你已经拥有一个Mugeda网站的账号.如果还没有,你可以登录 www.mugeda ...
- memcached学习笔记——存储命令源码分析上篇
原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...
- 文成小盆友python-num4 装饰器,内置函数
一 .python 内置函数补充 chr() -- 返回所给参数对应的 ASCII 对应的字符,与ord()相反 # -*- coding:utf-8 -*- # Author:wencheng.z ...
- HTML&CSS基础学习笔记1.2-HTML的全局属性?
HTML元素都有属性,下面的这些全局属性是所有的HTML元素都可以使用的. 常见的有: HTML元素也有一些本身自己独特的属性,我们以后的笔记中有机会,会再为大家介绍哦. 下面是代码测验,具体的内容可 ...
- C语言初学 使用while语句统计输入字符个数
#include<stdio.h> main() { int n=0; printf("输入任意个数的字符:\n"); while(getchar()!='\n')n+ ...
- Nexus Root Toolkit教程—— 解锁与Root
Nexus Root Toolkit是Nexus系列手机的专属root工具,本工具可为Nexus系列设备提供解锁.root和反解锁,还可以支持重要数据的备份和恢复.本教程以nexus 7二代和Nexu ...
- [工具] 解决sublime text运行javascript console无输出问题
1.使用nodeJS在sublime text 运行javascript 下载安装nodeJS 在sublime text新建build system:tools->build system-& ...
- 基本套接字总结(@function)
最近学习了下UNIX下的网络编程.为了以后查询方便,总结在这里. 首先套接字的地址定义: IPv4地址和IPv6地址定义见<netinet/in.h>头文件定义.为了能够顺利转换不同的套接 ...
- php 过滤html标签的函数
1:strip_tags(string,allow)用来过滤html标签,参数string必须,allow是指定允许哪些标签通过. 例如: <?php $info='<a href=&qu ...