美文网首页
原生cors限制

原生cors限制

作者: solfKwolf | 来源:发表于2019-07-25 23:26 被阅读0次
    • 不能使用自定义头部
    • 不能发送和接收
    • response 请求头为空

    什么是跨域

    image.png

    同源策略

    协议相同域名相同端口相同

    如何解决跨域问题

    jsonp(json+padding)

    优点:
    1.JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。
    2.只能实现get一种请求、不安全 容易遭到xss攻击

    function jsonp({url,params,cb}) { 
        return new Promise((resolve, reject) => { 
          let script = document.createElement('script');               
          window[cb] = function (params) {     
                   resolve(params); 
          }      
          params = {...params,cb};  
          let arrs = [];  
          for(let key in params){  
              arrs.push(`${key}=${params[key]}`);       
           }                
          script.src = `${url}?${arrs.join('&')}`;   
          document.body.appendChild(script);
                });        }; 
    jsonp({  
     url: 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su', 
     params:{wd:'a'},    
     cb:'show'       
     }).then(data=>{            
     console.log('jsonp跨域请求的数据为:',data);   
    });
    

    CORS

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

    ps:普通跨域请求:只服务端设置Access-Control-Allow-Origin即可,前端无须设置,若要带cookie请求:前后端都需要设置。由于同源策略的限制,所读取的cookie为跨域请求接口所在域的cookie,而非当前页。

    (1)Access-Control-Allow-Origin该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。
    (2)Access-Control-Allow-Credentials该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。
    (3)Access-Control-Expose-Headers该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。

    withCredentials 属性

    CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段。

    Access-Control-Allow-Credentials: true
    

    开发者必须在AJAX请求中打开withCredentials属性

    var xhr = new XMLHttpRequest();
    xhr.withCredentials = true;
    

    需要注意的是,如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。

    相关文章

      网友评论

          本文标题:原生cors限制

          本文链接:https://www.haomeiwen.com/subject/ppklrctx.html