zoukankan      html  css  js  c++  java
  • 如何跨域请求

    为何要跨域

    浏览器为了防止csrf(跨站请求伪造),NetScape提出的一个著名的安全策略:同源策略。所谓的同源,指的是协议,域名,端口相同。浏览器处于安全方面的考虑,只允许本域名下的接口交互,不同源的客户端脚本,在没有明确授权的情况下,不能读写对方的资源。
    同源三要素

    • 协议相同
    • 域名相同(域名和对应的ip也被视为不同,因为浏览器不会为你请求dns判断)
    • 端口相同

    随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。

    • Cookie、LocalStorage和IndexDB无法读取。
    • DOM 无法获取。
    • AJAX 请求不能发送。

    如何跨域

    如果需要跨域请求,那么有如下几种方法:

    不同二级域名下cookie共享

    如果两个网页一级域名相同,只是二级域名不同,浏览器允许通过设置document.domain共享 Cookie。
    设置方法:

    #两个网站设置相同的document.domain属性
    document.domain = 'example.com';
    
    A网站设置cookie:
    document.cookie = "test1=hello";
    
    B网站访问cookie:
    var allCookie = document.cookie;  //可以获取到
    
    

    注意:如果共享了cookie,也就意味着只要有一个网站被攻击成功,另一个网站的cookie也将被获取。有黑客论坛专门讲过从其他二级域名下手攻克网站的教程。

    这种方法有一定局限性如下:

    1. 如果修改了document.domain,则在某些机器上的IE678里,获取location.href有权限异常。
    2. 如果页面修改了document.domain,则它包含的iframe,必须也设domain,才能进行交互。就算是同域的页面也必须要设。
    3. 这种方法不适用于LocalStorage 和 IndexDB ,要使用其他方法规避。

    JSONP

    它的基本思想是,浏览器对于带有src的标签,不被同源策略限制,网页通过添加一个