Access-Control-Allow-Origin與跨域

轉自:http://www.tuicool.com/articles/7FVnMz


今天與萌萌一起修bug,遇到一個跨域的問題。我們兩個都對它有一些不太清楚,一起搞清楚後記錄下來。

問題

在某域名下使用Ajax向另一個域名下的頁面請求數據,會遇到跨域問題。另一個域名必須在response中添加 Access-Control-Allow-Origin 的header,才能讓前者成功拿到數據。

這句話對嗎?如果對,那麼流程是什麼樣的?

跨域

怎樣才能算跨域?協議,域名,端口都必須相同,纔算在同一個域。

參考:

當跨域訪問時,瀏覽器會發請求嗎

這是真正困擾我們的問題,因爲我們不清楚瀏覽器會怎麼做。它會不會檢查到你要請求的地址不是同一個域的,直接就禁止了呢?

我在jsbin上 做了一個試驗 ,使用Chrome打開。當點擊“Run with Js”時,控制檯上會打出:

XMLHttpRequest cannot load http://google.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://run.jsbin.io' is therefore not allowed access. 

但開發者工具的”Network”欄並沒有任何記錄。它到底發請求了沒?

我又使用 python -m SimpleHTTPServer 在本地創建了一個小服務器,然後把地址改成它,結果發現在python這邊的確打印出請求來了,可見瀏覽器的確發出了請求。

Access-Control-Allow-Origin

現在該 Access-Control-Allow-Origin 出場了。只有當目標頁面的response中,包含了 Access-Control-Allow-Origin 這個header,並且它的值裏有我們自己的域名時,瀏覽器才允許我們拿到它頁面的數據進行下一步處理。如:

Access-Control-Allow-Origin: http://run.jsbin.io

如果它的值設爲 * ,則表示誰都可以用:

Access-Control-Allow-Origin: *

沒錯,在產品環境中,沒人會用 *

你可以閱讀下面這篇文章瞭解更多,並可找到其中的”Run Sample”鏈接,實際體驗一下:

http://www.html5rocks.com/en/tutorials/cors/





發佈了348 篇原創文章 · 獲贊 28 · 訪問量 204萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章