【reference:http://www.javashuo.com/article/p-aldnmuns-ms.html】html
如今不少人特別是前端開發人員,在ajax請求,XMLHttpRequest的過程當中會碰到一個問題,那就是跨域請求:前端
當咱們javaScript腳本試圖跨域訪問時,瀏覽器會告訴你相似於No 'Access-Control-Allow-Origin' header is present on the requested resource.的消息。java
但是我有時候又有跨域請求的強烈需求,好比須要去別的網站抓取一些數據(固然如今有不少方法來支持跨域,但這不是本文要講的內容)。原來這是瀏覽器的一個策略----「同源策略」。web
所謂同源策略,它是瀏覽器的一種最核心最基本的安全策略。它對來自不一樣源的文檔或這腳本對當前文檔的讀寫操做作了限制。ajax
爲何要有這個策略,想必你已經知道,那就是由於保證用戶的信息安全。跨域
假設如今有a.com和b.com兩個域,若是沒有這一安全策略,那麼當用戶在訪問a.com時,a.com的一段腳本就能夠在不加載b.com的頁面而隨意修改或者獲取b.com上面的內容。這樣將會致使b.com頁面的頁面發生混亂,甚至信息被獲取,包括服務器端發來的session。這樣的話,咱們的web世界將是一片混亂。也是由於瀏覽器的同源策略,保證來至不一樣源的對象不會互相干擾,保證了咱們訪問頁面最基本的安全。瀏覽器
只有同一域名或者,同一域名不一樣文件夾下是容許跨域的,其餘的狀況都是不容許跨域。安全
訪問同源的資源是被瀏覽器容許的,可是若是訪問不一樣源的資源,瀏覽器默認是不容許的。訪問不一樣源的資源那就是咱們所說的跨域服務器
從表中能夠看出域名,子域名,端口號,協議不一樣都屬於不一樣源,當腳本被認爲是來至不一樣源時,均被瀏覽器拒絕請求。session
在這裏須要注意的是,文檔中的全部帶「src」屬性的標籤均可以跨域加載資源,而不受同源策略的限制。
如<script>、<img>、<iframe>、<link>等。若是你在頁面定義了這些標籤,在頁面加載事都對不一樣源的資源發起了一次GET請求。可是經過src加載的資源,瀏覽器限制了腳本對其返回的內容沒法讀寫。特別是在ajax請求的時候,特別要注意XMLHttpRequest的時候是沒法跨域訪問的。
當咱們b.com在頁面加載不一樣源的資源時 <script src='a.com/a.js'></script> ,對於頁面來講,a.js是運行在b.com上的,所以對於當前頁面來講,a.js的源(Origin)是b.com而不是a.com。
所以頁面內存放的資源的域a.com並不重要,重要的是加載資源的頁面所在的域b.com。