今天來記錄一下關于ajax跨域的一些問題。以備不時之需。
跨域
同源策略限制
同源策略阻止從一個域上加載的腳本獲取或操作另一個域上的文檔屬性。也就是說,受到請求的 URL 的域必須與當前 Web 頁面的域相同。這意味著瀏覽器隔離來自不同源的內容,以防止它們之間的操作。
解決方式
通常來說,比較通用的有如下兩種方式,一種是從服務器端下手,另一種則是從客戶端的角度出發。二者各有利弊,具體要使用哪種方式還需要具體的分析。
方式一
Access-Control-Allow-Origin 關鍵字只有在服務器端進行設置才
會生效。也就是說即使再客戶端使用
xmlhttprequest.setHeaderREquest('xx','xx');也不會有什么效果。
正常ajax請求
下面來模擬一下ajax非跨域請求的案例實現。
test1.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>ajax 測試</title></head><body><input type="button" value="Test" onclick="crossDomainRequest()"><div id="content"></div><script> var xhr = new XMLHttpRequest(); var url = 'http://localhost/learn/ajax/test1.php'; function crossDomainRequest() { document.getElementById('content').innerHTML = "<font color='red'>loading...</font>"; // 延遲執行 setTimeout(function () { if (xhr) { xhr.open('GEt', url, true); xhr.onreadystatechange = handle_response; xhr.send(null); } else { document.getElementById('content').innerText = "不能創建XMLHttpRequest對象"; } }, 3000); } function handle_response() { var container = document.getElementById('content'); if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status == 304) { container.innerHTML = xhr.responseText; } else { container.innerText = '不能跨域請求'; } } }</script></body></html>同級目錄下的test1.PHP內容如下:
<?phpecho "It Works.";?>

跨域請求
剛才是HTML文件和php文件都在Apache的容器下,所以沒有出現跨域的情形,現在把HTML文件放到桌面上,這樣再次請求PHP數據的話,就營造了這樣一個“跨域請求”了。
注意看瀏覽器的地址欄信息
再次進行訪問,發現會出現下面的錯誤信息。

針對這種情況,比較常見的一個操作就是設置Access-Control-Allow-Origin。
格式: Access-Control-Allow-Origin: domain.com/xx/yy.*
如果知道客戶端的域名或者請求的固定路徑,則最好是不使用通配符的方式,來進一步保證安全性。如果不確定,那就是用*通配符好了。
后端開發語言為PHP的時候可以再文件開始處這么設置:
header("Access-Control-Allow-Origin: *");如果是ASPX頁面的話,要這么設置(Java與之類似):
Response.AddHeader("Access-Control-Allow-Origin", "*");這時,再次來訪問一下剛才的路徑。

服務器代理模式
這種方式應該算是比較常用的,而且被廣泛采納的一個方式了。說代理有點太過于書面化了,其實就是傳話兒的。來舉個小例子:
小明喜歡三班一個叫小紅的女孩兒,但是不好意思去要人家的QQ,微信號。然后就托和自己班的女生 主站蜘蛛池模板: 贞丰县| 桂东县| 余干县| 永登县| 漯河市| 鄢陵县| 江城| 罗田县| 芜湖县| 田东县| 增城市| 黄平县| 修文县| 巴青县| 息烽县| 郑州市| 上饶县| 武川县| 多伦县| 涡阳县| 库伦旗| 临夏市| 黄冈市| 佛坪县| 临颍县| 沽源县| 京山县| 海淀区| 远安县| 禄劝| 馆陶县| 寿宁县| 甘洛县| 尼木县| 陆河县| 宁城县| 焉耆| 宜黄县| 新丰县| 邵阳市| 诸城市|