Cross-Orign Resource Sharing简介
来源:互联网 发布:超星泛雅网络课程 编辑:程序博客网 时间:2024/05/16 04:46
定义
CORS其实出现时间不短了,它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。 它是一个妥协,有更大的灵活性,但比起简单地允许所有这些的要求来说更加安全。
而W3C的官方文档目前还是工作草案,但是正在朝着W3C推荐的方向前进。
简言之,CORS就是为了让AJAX可以实现可控的跨域访问而生的。
以往的解决方案
以前要实现跨域访问,可以通过JSONP、Flash或者服务器中转的方式来实现,但是现在我们有了CORS。
CORS与JSONP相比,无疑更为先进、方便和可靠。
1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS(这部分会在后文浏览器支持部分介绍)。
详细内容
要使用CORS,我们需要了解前端和服务器端的使用方法。
1、 前端
以前我们使用Ajax,代码类似于如下的方式:
var xhr = new XMLHttpRequest(); xhr.open("GET", "/hfahe", true); xhr.send();
这里的“/hfahe”是本域的相对路径。
如果我们要使用CORS,相关Ajax代码可能如下所示:
var xhr = new XMLHttpRequest(); xhr.open("GET", "http://blog.csdn.net/hfahe", true); xhr.send();
请注意,代码与之前的区别就在于相对路径换成了其他域的绝对路径,也就是你要跨域访问的接口地址。
我们还必须提供浏览器回退功能检测和支持,避免浏览器不支持的情况。
function createCORSRequest(method, url) { var xhr = new XMLHttpRequest(); if ("withCredentials" in xhr) { // 此时即支持CORS的情况 // 检查XMLHttpRequest对象是否有“withCredentials”属性 // “withCredentials”仅存在于XMLHTTPRequest2对象里 xhr.open(method, url, true); } else if (typeof!= "undefined") { // 否则检查是否支持XDomainRequest,IE8和IE9支持 // XDomainRequest仅存在于IE中,是IE用于支持CORS请求的方式 xhr = new XDomainRequest(); xhr.open(method, url); } else { // 否则,浏览器不支持CORS xhr = null; } return xhr; } var xhr = createCORSRequest('GET', url); if (!xhr) { throw new Error('CORS not supported'); }
现在如果直接使用上面的脚本进行请求,会看到浏览器里控制台的报错如下:
错误显示的很明显,这是因为我们还未设置Access-Control-Allow-Origin头。
2、 服务器
服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。
HTTP 头的设置方法有很多,http://enable-cors.org/这篇文章里对各种服务器和语言的设置都有详细的介绍,下面我们主要介绍Apache和PHP里的设置方法。
Apache:Apache需要使用mod_headers模块来激活HTTP头的设置,它默认是激活的。你只需要在Apache配置文件的<Directory>, <Location>, <Files>或<VirtualHost>的配置里加入以下内容即可:
Header set Access-Control-Allow-Origin *
PHP:只需要使用如下的代码设置即可。
header("Access-Control-Allow-Origin:*");
*为通配符
以上的配置的含义是允许任何域发起的请求都可以获取当前服务器的数据。当然,这样有很大的危险性,恶意站点可能通过XSS攻击我们的服务器。所以我们应该尽量有针对性的对限制安全的来源,例如下面的设置使得只有http://blog.csdn.net这个域才能跨域访问服务器的API。
Access-Control-Allow-Origin: http://blog.csdn.net
浏览器支持情况
上图为各浏览器对于CORS的支持情况(绿色为支持,数据来源:http://caniuse.com/cors),看起来相当乐观。主流浏览器都已基本提供对跨域资源共享的支持,所以,CORS才会在国外使用的如此普遍。
IE8和IE9在某种程度上可以通过XDomainRequest来提供同样功能的支持。
来源:http://blog.csdn.net/hfahe/article/details/7730944
- Cross-Orign Resource Sharing简介
- Cross-Origin Resource Sharing
- Ajax:Cross-Origin Resource Sharing
- Cross-Origin Resource Sharing Specification
- Ajax - CORS - Cross Origin Resource Sharing
- 跨域资源共享(Cross-Origin Resource Sharing)
- tomcat manager the Cross Origin Resource Sharing
- Cross-Origin Resource Sharing协议介绍
- apache配置 - 跨域资源共享(Cross-Origin Resource Sharing)
- CORS(Cross-Origin Resource Sharing)跨域资源共享
- apache配置 - 跨域资源共享(Cross-Origin Resource Sharing)
- Cross-Origin Resource Sharing 跨域资源共享研究心得
- Cross-Origin Resource Sharing[1] 跨域资源共享
- Rails应用使用跨域资源共享Cross-origin resource sharing
- 使用ajax跨域Cross-Origin Resource Sharing / withCredentials的作用
- 跨域资源共享 CORS(Cross-origin resource sharing)
- WEB跨域资源共享:Cross-origin Resource Sharing(CORS)
- Cross-Origin Resource Sharing (CORS)跨域资源共享
- 中国“互联网+”案例100征集活动正式启动
- android开发轻量级数据库SQLite
- LeetCode Implement strStr(kmp或者BM)
- UI基础之--UILabel
- solr
- Cross-Orign Resource Sharing简介
- 关于Android 6.0 调用 要求使用权限代码报红色问题
- Delphi中挂接IWebBrowser2的自动化事件
- JAVA IO
- 解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
- 图片像素与色彩模式
- ```C#学习(五)···
- JavaWeb学习总结(十七)——JSP中的九个内置对象
- voc-release5在window下编译总结