CORS(Cross-Origin Resource Sharing)是指跨域资源共享,用于解决前端跨域问题。跨域问题最参见的方法就是使用JSONP
,可是不少跨域问题JSONP
是没法解决的,好比html
POST跨域请求前端
'script error'
的脚本错误提示git
canvas
中没法得到跨域图片的信息
若是使用CORS
,上面几个问题均可以解决。github
服务端对header
设置一个Access-Control-Allow-Origin: *
,开启跨域请求。*
表示接受全部域名的请求。也能够指定特定的域名 Access-Control-Allow-Origin: http://www.client.com
。
我专门整理了一个使用CORS
解决跨域的例子。能够去github上下载。
在github
的例子中,须要设置host
, 将www.client.com
和www.server.com
都指向本地。而后使用本地服务器来测试。ajax
127.0.0.1 www.client.com 127.0.0.1 www.server.com
其中www.client.com
是指当前页面的域名,www.server.com
是第三方的域名。canvas
github的例子中,scripts/client.js
中对www.server.com
域名发送ajax
请求。当www.server.com
没有对header
的Access-Control-Allow-Origin
进行设置时,请求是报错的。如图:跨域
设置Access-Control-Allow-Origin
后,能够正常得到数据。以下图,第一张是返回的结果,第二张是headers
信息。服务器
同源策略影响到的不单单是ajax
请求跨域接口,对跨域资源(包括js,图片等)也会有限制。好比www.client.com
域名下页面请求了一个www.server.com
域名下的js
资源server.js
,js
资源能够被正常加载和运行。可是当js
资源中发生错误,有error
抛出时,www.client.com
中是没法知道error
的细节的。demo
中index.html
页面对onerror
进行了处理,输出错误信息。可是当跨域资源www.server.com/demo/cors/scripts/server.js
中抛出异常时,只能显示'script error'
信息。如图:cors
要支持跨域脚本error
信息的输出,须要两步:测试
服务器对js
资源的header
作Access-Control-Allow-Origin
的设置
script
标签中添加属性crossorigin="anonymous"
加上上面的逻辑后,错误信息就能够正常输出了:
图片做为一种资源,也会受到同源策略的影响。好比,www.client.com
域名下的页面,经过canvas
绘制了一个www.server.com
域名的图片,当使用canvas
的toBlob()
, toDataURL()
, getImageData()
时,会有error
发生。如图:
若是对图片的header
设置了Access-Control-Allow-Origin
,就能够正常调用这些方法。