其他分享
首页 > 其他分享> > 原生JS之CORS

原生JS之CORS

作者:互联网

CORS全称是:Cross-Origin Resource Sharing,跨域资源共享。是解决AJAX跨域的一种方案。正常情况下,AJAX 发起跨域请求后,浏览器拒绝接收响应,会报跨域的错。CORS是W3C的一个标准,他新增了一些机制,可以使得浏览器能够接收跨域的响应。虽然JSONP能够实现跨域,但它不够正统,存在一些缺陷,JSONP只支持GET请求,这就需要一种更加正统的方法,而不是像JSONP一样利用了 <script> 标签可以加载跨域JS的特性来实现跨域,这样的法更像是曲线救国。那么有可不可以从本质上实现跨域访问呢,并且不局限于GET请求,这就是CORS。

小结:CORS是实现AJAX跨域的一种方案。

如何实现CORS

先知道怎么用,再搞懂原理。实现CORS很简单,前端的AJAX代码不需要任何改动,只需要后端设置一下响应头的 Access-Control-Allow-Origin 字段就能够实现跨域访问。将 Access-Control-Allow-Origin 的值设置成请求方的域名即可,当然也可以设置成 * ,即表示,任何域名的请求都可以访问。例:请求方域名是 http://www.a.com ,假设我需要向 http://www.b.com 发接口请求。那么服务需要响应端设置响应头 Access-Control-Allow-Origin: http://www.a.com 。这样就能够顺利请求了。

小结:后端设置响应头的 Access-Control-Allow-Origin 字段。

CORS的本质

同源策略的本质

首先,你要搞清楚,是同源策略导致了跨域问题。根本原因是浏览器做了限制,浏览器不让你从别的地方去请求数据,即使请求发出去了,浏览器也不会接受的响应的,这是一种安全策略。

CORS的本质

如何使得浏览器接受跨域的响应呢?这就得让浏览器知道,噢,这个响应是安全的,是可以接收的。那么浏览器又通过什么东西知道响应是安全的,是能够接收的呢?当然是响应头了。那么只需要在响应头里告诉浏览器,这个响应是没问题的,你接收吧。那么究竟怎么做呢,具体是如何在响应头里进行相关设置呢,这就是CORS规定的,这就是CORS标准。

跨域资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。这些HTTP头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。CORS定义了在访问跨源资源时,浏览器与服务器应该如何沟通。CORS 背后的基本思想,就是使用自定义的HTTP头部,让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。

小结:CORS的本质是通过HTTP响应头告诉浏览器,响应是安全的,可以接收的。

IE中的CORS

对于IE10以下,CORS的实现并不是在XMLHTTPRequest对象上实现的(IE支持XHR对象,只是CORS不是在XHR对象上实现的),对于IE10 - ,CORS是在IE独有的 XDomainRequest (XDR) 上实现的,这个对象和XHR一样,用法和功能几乎一样。

XDR的用法:

if(window.XDomainRequest){
  var xdr = new XDomainRequest();
  xdr.open("get", "http://example.com/api/method");
  xdr.onprogress = function () {
    //Progress
  };
  xdr.ontimeout = function () { 
    //Timeout
  };
  xdr.onerror = function () { 
    //Error Occured
  };
  xdr.onload = function() {
    //success(xdr.responseText);
  }
  setTimeout(function () {
    xdr.send();
  }, 0);
}
复制代码

XDR的用法基本和XHR一样,有些细微的地方需要注意:

标签:原生,浏览器,跨域,JS,响应,xdr,CORS,请求
来源: https://blog.csdn.net/ZM11111001100/article/details/101208006