啟用CORS實現Ajax跨域請求
某年某月的一天,需要實現這樣一個需求,在當前網站中用ajax發送一個請求到另一個網站擷取資料,b.com —> s.com,剛開始以為沒什麼,不就一條請求嘛,立馬就寫了出來,結果出現一個錯誤200的請求,還有一個提示資訊;
20141020162144
這是什麼情況,於是找度娘問了起來,大概的結果如下(部分文字直接拿過來的):
跨域是我在日常面試中經常會問到的問題,這詞在前端界出現的頻率不低,主要原因還是由於安全限制(同源策略, 即JavaScript或Cookie只能訪問同域下的內容)
CORS的原理:
CORS定義一種跨域訪問的機制,可以讓AJAX實現跨域訪問。CORS 允許一個域上的網路應用向另一個域提交跨域 AJAX 請求。實現此功能非常簡單,只需由伺服器發送一個響應標題即可。
假設我們頁面或者應用已在 http://qq.111cn.net 上了,而我們打算從http://qq.111cn.net 請求提取資料。一般情況下,如果我們直接使用 AJAX 來請求將會失敗,瀏覽器也會返回“源不匹配”的錯誤,”跨域“也就以此由來。
利用 CORS,http://qq.111cn.net 只需添加一個標題,就可以允許來自 http://www.b.com 的請求,下圖是我在PHP中的 hander() 設定,“*”號表示允許任何域向我們的服務端提交請求:
header(“Access-Control-Allow-Origin:*“);
也可以設定指定的網域名稱,如網域名稱 http://www.111cn.net ,那麼就允許來自這個網域名稱的請求:
header(“Access-Control-Allow-Origin:http://www.111cn.net“);
當前我設定的header為“*”,任意一個請求過來之後服務端我們都可以進行處理&響應,那麼在調試工具中可以看到其頭資訊設定,其中見紅框中有一項資訊是“Access-Control-Allow-Origin:* ”,表示我們已經啟用CORS,如下圖。
//相容IE8的javascript
//瀏覽器是否通過XHR支援CORS,合并<strong>XDomainRequest </strong>對象的存在性來支援所有的瀏覽器
代碼如下 |
複製代碼 |
function createCORSRequest(method, url){ var xhr = new XMLHttpRequest(); if ("withCredentials" in xhr){ xhr.open(method, url, true); } else if (typeof XDomainRequest != "undefined"){ xhr = new XDomainRequest(); xhr.open(method, url); } else { xhr = null; } return xhr; } var request= createCORSRequest("get", "http://www.111cn.net"); if (request){ datas.onload = function(){ //do something with request.responseText,responseText伺服器中返回的資料 }; request.send(); } |