1. 程式人生 > >HTML5開發中Access-Control-Allow-Origin跨域問題

HTML5開發中Access-Control-Allow-Origin跨域問題

今天準備通過JavaScript的方式呼叫問說問答的內容,由於使用的不同的二級域名,遇到了一個跨域問題,雖然可以使用JSON或者XML來解決這個問題,但是我們可以通過Access-Control-Allow-Origin解決跨域問題,下面一起來看看Access-Control-Allow-Origin跨域問題的解決方法。

什麼是跨域?

顧名思義,跨域就是不同的域名下的資源訪問,會被瀏覽器的本地安全策略阻止,例如www.uedsc.com去AJAX請求一個wenda.uedsc.com的資源,他們實際上是不同的兩個二級域名,頂級域名是uedsc.com,就會出現跨域訪問問題。

下面的這張表格可以清晰解釋那些屬於跨域,那時不是屬於跨域

URL 說明 是否允許通訊
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允許
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同資料夾 允許
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同埠 不允許
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同協議 不允許
http://www.a.com/a.js
http://170.32.82.74/b.js
域名和域名對應ip 不允許
http://www.a.com/a.js
http://script.a.com/b.js
同一域名,不同二級域名 不允許
http://www.a.com/a.js
http://a.com/b.js
二級域名和一級域名 不允許(cookie這種情況下也不允許訪問)
http://www.b.com/a.js
http://www.a.com/b.js
不同域名 不允許

有了對跨域的基本概念瞭解後,就可直接進入這篇文章的主題了。

跨域訪問解決方法

若在接收請求的服務端abc.com/B頁面用的是php語言,則在頁面頭部加入,注意一定是在沒有輸出任何資訊之前:

// 指定可信任的域名來接收響應資訊,推薦
header('Access-Control-Allow-Origin:http://A.abc.com');

或者你可以設定響應任意域名的資源

// 使用萬用字元 * ,表示當前服務端通話任何域名發起請求,不推薦
header('Access-Control-Allow-Origin:*');

就這樣在服務端簡單加一句響應頭responese headers宣告,一個跨域請求就不會被瀏覽器的同源安全策略所阻止了!

注意

新增響應頭responese headers時,允許跨域請求的域名帶不帶斜槓/還是有區別的,帶斜槓/會報錯:

XMLHttpRequest cannot load  abc.com/B. The ‘Access-Control-Allow-Origin’ header has a value ‘http://A.abc.org/’ that is not equal to the supplied origin. Origin ‘http://A.abc.org’ is therefore not allowed access.

header('Access-Control-Allow-Origin:*');是html5新增的一項標準功能,因此 IE10以下版本的瀏覽器是不支援的,因此,如果要求相容IE9或更低版本的ie瀏覽器,會導致使用此種方式的跨域請求以及傳遞Cookie的計劃夭折,最終還得迴歸JSONP,目前主流 的處理方式是使用JSONP,易於實現,相容性好,可查的資料也很多。

跨域解決後,如果還要操作Cookie,還得繼續補增響應頭:

header('Access-Control-Allow-Credentials:true');

需要將 XMLHttpRequest 物件的 withCredentials 屬性設定為 true,JQuery1.5.1+ 就開始提供了相應的欄位,使用方式如下:

$.ajax({
    url:"B.abc.com",
    xhrFields:{
        withCredentials:true
    },
    crossDomain:true
});

設定 withCredentials 為 true 的請求中會包含 A.abc.com端的所有Cookie,這些Cookie仍然遵循同源策略,所以,你只能訪問其中和 abc.com/B同根域的Cookie,而無法訪問其他域的Cookie。

Access-Control-Allow-Origin實則是html5 Cross-Origin Resource Sharing實現的最重要的一點引數配置。
Cross-Origin Resource Sharing,跨域資源共享,簡稱 CORS,可以作為一種跨域請求以及響應的解決方案。

附:禁用瀏覽器安全策略

禁用chrome本地安全策略,不用配伺服器環境也能發起ajax請求:
chrome 桌面快捷鍵 右鍵屬性 在快捷方式標籤下的“目標”框中加入 --disable-web-security,重啟瀏覽器即可