码迷,mamicode.com
首页 > 其他好文 > 详细

使用CORS:跨域两三事

时间:2015-03-19 21:39:32      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

本文为译文。

简介

    APIS是可以将富网页应用串连在一起的线程。但是这个应用难以转给浏览器,跨域请求技术的选择被限制了,类似JSONP(由于安全考虑,使用会被限制),或者配置代理(设置和维护都比较头痛)。

    Cross-Origin Resource Sharing(CORS)是允许来自浏览器的跨域通信的W3C规范。通过设置XMLHttpRequest的头部,CORS允许开发者使用类似同域中请求惯用的方法。

    CORS的用法很简单,假设网站alice.com有一些bob.com想要获取的数据。这类型的请求以前通常在浏览器的同源策略下不被允许。但是,借助CORS请求,alice.com可以加一些特殊回应头信息允许bob.com取得数据。

    可以从这个例子里面看出来,支持CORS需要服务器和客户端之间的协调。幸运的是,如果你是客户端开发者,你可以屏蔽掉这中间大多数的细节。这篇文章余下的部分会展示客户端如何进行跨域请求,及服务器如何配置来支持CORS。

发起CORS请求

    这部分介绍如何使用javascript发起CORS请求。

    创建XMLHttpRequest请求:

    下列浏览器支持CORS:

    Chrome 3+

    Firefox 3.5+

    Opera 12+

    Safari 4+

    Internet Explorer 8+

    Chrome,Firefox,Opera,Safari都使用XMLHttpRequest2对象,IE使用类似的XDomainRequest对象,与他本身对应的XMLHttpRequest对象工作机制基本相同,但是另外增加了安全防范。

    首先要创建合适的请求对象,像这样:

技术分享

事件处理

    原始的XMLHttpRequest只有一个事件处理onreadystatechange,来处理所有的响应。虽然onreadystatechange依然可以使用,XMLHttpRequest2引进了一系列新的处理,下面是一个列表:

技术分享

    在大多数情况下,你只仅仅想处理onload和onerror事件:

技术分享

    当有错误的时候,浏览器不会报告是什么错误。例如,FF对所有错误报告一个状态0和空statusText。浏览器也会向控制输出台报错,但是这个消息没法被javascript获取到。当处理onerror的时候,会知道有一个错误发生了,但没有更多信息了。

withCredentials

    标准的CORS在默认情况下不发送和设置任何cookie。为了使cookie成为请求的一部分包含进来,需要设置XMLHttpRequest的withCredentials属性为true:

技术分享

    为了达成这个目的,服务器也需要设置Access-Control-Allow-Credientials为true来允许认证。

技术分享

    withCredentials属性会包含来自远程域的请求的任何cookie。注意这些cookies仍然遵循同源策略,所以你的javascript代码仍然从document.cookie中访问不到这些cookies或者请求头.他们只能被远程域所控制。

发送请求

    现在你的CORS请求已经配置好了,你准备发送请求。这个通过调用send()方法来实现:

技术分享

    如果请求包含请求体,可以被指定为一个参数给send().

    就是酱紫!假定服务器已经完全配置好来响应CORS请求了,你的onload处理会收到响应,就像你十分熟悉的标准的同域XHR那样。

最后最后一个例子

    这是一个完整的CORS请求例子。运行下例子在浏览器debugger里面看看发送的请求。

技术分享

在服务器端添加CORS支持

    多数的CORS重担在浏览器和服务器之间被处理了。浏览器增加了额外的一些头,有时发起额外的请求,在CORS请求期间。这些额外的请求对于客户端是不可见的(可以使用Wireshark等工具来捕获)。

技术分享

    浏览器厂商对于浏览器端的实现是有责任的。下面了解下服务器端如何配置来支持CORS。

请求的类型

跨域请求分类:

    1.简单请求

    2.非简单请求

技术分享

    简单请求不需要使用CORS从浏览器发出请求。例如,一个JSONP跨域请求可以是一个跨域的GET请求。

    非简单请求,在浏览器与服务器间需要一点额外的交互。

处理一个简单请求

    --待续--

使用CORS:跨域两三事

标签:

原文地址:http://www.cnblogs.com/linda586586/p/4351452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!