「一篇老文章」
注:這個頁面並不高深,例子只有乙個html頁面,沒有引用什麼特別的庫之類的.例子的目的只是讓對ajax不能跨域訪問有乙個感性的認識.就好比,你如何告訴乙個沒見過汽車的人,告訴他什麼是汽車,講半天,還不如直接給個汽車給他看看,他就知道什麼是汽車了.但你要他直接給乙個清晰的定義,或者是讓他明白汽車的動力學,這就是很難的了,也不是本文的目的.
下面這個簡單的**只要複製到乙個本地html檔案中即可,就可以把任何url指定的網頁顯示出來[注1],但是同樣的頁面,你如果放到tomcat之類的容器下面,就無法開啟,甚至通過網路鄰居訪問都不行.
分析1:為什麼好好的頁面卻得不到期望的結果:
為什麼js語法沒有什麼問題,放在網路鄰居與web容器中就不能正常執行了呢,這就是ajax所說的不能跨域訪問,因為瀏覽器你這個js程式是來自容器,它就限制你只能正常訪問同一容器裡的的資源[注:2],比如你通過訪問到乙個頁面,那麼這個頁面的js就只能訪問openj.cn的資源,而不能訪問www.baidu.com.
為什麼ie在通過本地檔案能正常執行這個頁面的,我是在xp下測試的,可能ie把本地這個域處理成了乙個特殊的域,從這個域得到的js程式,許可權可以略微放鬆些,這樣可能易用性就會好些,要知道安全性與使用的方便性可是此消彼長的關係.所以ie選擇了易用性,在安全問題上放了乙個黃燈,為什麼說是黃燈呢,因為它在執行這個頁面時,ie會給出乙個安全提示,告訴你這個頁面存在風險.
分析2:為什麼要限制ajax跨域訪問[注3]:
可以肯定的說是出於安全的需要,但我沒有找到什麼資料明確這個問題分析,我只能通過看其它資料來自己體會了,我自己發現的乙個安全問題就是:
ajax可能會把使用者的cookie資訊洩漏出去,比如我往別使用者的gmail信箱裡面發嵌有js指令碼的郵件.這些指令碼讀取gmail.com域中的cookies資訊,然後通過ajax傳送給我的個人**,這樣我的個人**就可以得到這個使用者的gmail的cookies.我然後把它提取出來,我就可以不用密碼來訪問這個使用者的gmail郵箱了.
這個只是我能想到的,我想如果能夠讓ajax能夠跨域訪問的話,肯定還有其它一些安全問題.
注[1];對這個測試頁面好像只有在一種情況下才能正常執行:就是通過ie開啟本地檔案。如果用firefox就算是通過本地檔案開啟它也不能正常執行。
[2]:為了把問題簡單說明,我說了只能訪問同一容器裡面的資源,實際上是不精確的,真正的還是應該通過域來區分,同乙個容器裡面的資源也可能是指向不同的域.同乙個域的各個資源也可能分布在不同的容器中.比如:tomcat中有好2個虛擬目錄,你用不同的網域名稱來指向這兩個虛擬目錄,這個容器中的兩個虛擬目錄就是不同的域了.不同容器的資源也可能屬於同乙個域,比如我申請乙個網域名稱:openj.cn,我設定 www.openj.cn指向www.baidu.com,而blog.openj.cn指向www.google.com。這樣baidu與google的首頁就都屬於openj.cn這個域了.
[3]: 本文沒有區分ajax的跨域與js的跨域,因為ajax就是通過js來發現請求的,它們實際上是一回事。
[4]: 在**中,我定義了變數 var url = ''; 你可以把它修改為任何你能訪問的位址,
[5]:本文的內容全是自己的瞎體會的,如果有什麼不對的有高手發現了,希望大家能指出。這也是本文的主要目的。
">
">
Ajax跨域訪問
由於http的cors標準,ajax在跨域訪問時被阻止。跨域資源共享標準 cross origin sharing standard 在ajax 字型 drawimage應用情況下,需要對請求或相應做設定才能跨域訪問。ajax跨域訪問解決方案 jsonp 是 json with padding 填充...
Ajax 跨域訪問
同源 同一網域名稱下,允許通訊 同一網域名稱下不同資料夾,允許通訊 同一網域名稱,不同埠,不允許 同一網域名稱,不同協議,不允許 網域名稱和網域名稱對應ip,不允許 主域相同,子域不同,不允許 同一網域名稱,不同二級網域名稱 同上 不允許 不同網域名稱,不允許 跨域 doctype html htm...
JS跨域ajax訪問
需要服務和js配合 服務 webmethod public void helloworld2 string name js呼叫 var datastr name birthday val ajax error function e 如果是在.net下則在web.config中增加配置 在system...