如何跨域请求

为何要跨域

浏览器为了防止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的标签,不被同源策略限制,网页通过添加一个