如何跨域請求

為何要跨域

瀏覽器為了防止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的標籤,不被同源策略限制,網頁通過添加一個