posts - 82, comments - 269, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理



          AJAX不能跨域訪問是什么意思,我想沒有親自遇到這個問題的人,可能根本就不理解.現(xiàn)在我給出一個例子,讓大家體會一下什么是跨域訪問.這個頁面就是一個HTML文件,源碼我附文章后面了.

          注:這個頁面并不高深,例子只有一個HTML頁面,沒有引用什么特別的庫之類的.例子的目的只是讓對AJAX不能跨域訪問有一個感性的認識.就好比,你如何告訴一個沒見過汽車的人,告訴他什么是汽車,講半天,還不如直接給個汽車給他看看,他就知道什么是汽車了.但你要他直接給一個清晰的定義,或者是讓他明白汽車的動力學,這就是很難的了,也不是本文的目的.


          下面這個簡單的代碼只要復制到一個本地html文件中即可,就可以把任何URL指定的網(wǎng)頁顯示出來[注1],但是同樣的頁面,你如果放到tomcat之類的容器下面,就無法打開,甚至通過網(wǎng)絡鄰居訪問都不行.

          ?

          分析1:為什么好好的頁面卻得不到期望的結果:
          為什么JS語法沒有什么問題,放在網(wǎng)絡鄰居與web容器中就不能正常運行了呢,這就是AJAX所說的不能跨域訪問,因為瀏覽器你這個JS程序是來自容器,它就限制你只能正常訪問同一容器里的的資源[注:2],比如你通過http://www.openj.cn訪問到一個頁面,那么這個頁面的JS就只能訪問openj.cn的資源,而不能訪問www.baidu.com.


          為什么IE在通過本地文件能正常運行這個頁面的,我是在XP下測試的,可能IE把本地這個域處理成了一個特殊的域,從這個域得到的JS程序,權限可以略微放松些,這樣可能易用性就會好些,要知道安全性與使用的方便性可是此消彼長的關系.所以IE選擇了易用性,在安全問題上放了一個黃燈,為什么說是黃燈呢,因為它在運行這個頁面時,IE會給出一個安全提示,告訴你這個頁面存在風險.

          分析2:為什么要限制AJAX跨域訪問[注3]:
          可以肯定的說是出于安全的需要,但我沒有找到什么資料明確這個問題分析,我只能通過看其它資料來自己體會了,我自己發(fā)現(xiàn)的一個安全問題就是:
          AJAX可能會把用戶的cookie信息泄漏出去,比如我往別用戶的Gmail信箱里面發(fā)嵌有JS腳本的郵件.這些腳本讀取gmail.com域中的cookies信息,然后通過AJAX發(fā)送給我的個人網(wǎng)站,這樣我的個人網(wǎng)站就可以得到這個用戶的Gmail的cookies.我然后把它提取出來,我就可以不用密碼來訪問這個用戶的Gmail郵箱了.
          這個只是我能想到的,我想如果能夠讓AJAX能夠跨域訪問的話,肯定還有其它一些安全問題.


          [1];對這個測試頁面好像只有在一種情況下才能正常執(zhí)行:就是通過IE打開本地文件。如果用FireFox就算是通過本地文件打開它也不能正常運行。
          [2]:為了把問題簡單說明,我說了只能訪問同一容器里面的資源,實際上是不精確的,真正的還是應該通過域來區(qū)分,同一個容器里面的資源也可能是指向不同的域.同一個域的各個資源也可能分布在不同的容器中.比如:tomcat中有好2個虛擬目錄,你用不同的域名來指向這兩個虛擬目錄,這個容器中的兩個虛擬目錄就是不同的域了.不同容器的資源也可能屬于同一個域,比如我申請一個域名:openj.cn,我設置 www.openj.cn指向www.baidu.com,而blog.openj.cn指向www.google.com。這樣baidu與google的首頁就都屬于openj.cn這個域了.
          [3]: 本文沒有區(qū)分AJAX的跨域與JS的跨域,因為AJAX就是通過JS來發(fā)現(xiàn)請求的,它們實際上是一回事。
          [4]: 在代碼中,我定義了變量 var url = 'http://www.google.com';??? 你可以把它修改為任何你能訪問的地址,
          [5]:本文的內(nèi)容全是自己的瞎體會的,如果有什么不對的有高手發(fā)現(xiàn)了,希望大家能指出。這也是本文的主要目的。




          ?

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<HTML xmlns="<HEAD><TITLE>AJAX跨域驗證</TITLE>

          <script>
          var xmlHttp;
          function createXMLHttpRequest() {
          ??? if (window.ActiveXObject) {
          ??????? xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
          ??? }
          ??? else if (window.XMLHttpRequest) {
          ??????? xmlHttp = new XMLHttpRequest();
          ??? }
          }

          function hello() {
          ?var url = 'http://www.google.com';???
          ?createXMLHttpRequest();
          ?xmlHttp.onreadystatechange = showResponse;
          ?xmlHttp.open("GET", url, true);
          ?xmlHttp.send(null);
          }

          function showResponse(){
          ? if(xmlHttp.readyState == 4) {
          ?if(xmlHttp.status == 200) {????????
          ?document.getElementById("result").setAttribute("value",xmlHttp.responseText) ;
          ?}
          ?}
          }
          </script>

          </HEAD>

          <BODY>?
          ?<input type="button" value="hello" onclick="hello()"><br/><br/>
          ?<textarea id="result" name="result" cols=100 rows=100 ></textarea>
          </BODY>
          </HTML>

          ?

          ?

          ?


          ?


          評論

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2007-02-12 16:51 by TiGERTiAN
          其實Ajax跨域訪問還是可以解決的,不過需要用到后臺服務端。
          例如用戶訪問www.go.com,但go.com需要調用come.com的信息
          那么Ajax將需要跨域的數(shù)據(jù)交給www.go.com/send.asp
          然后再由send.asp發(fā)送到come.com,come.com反饋信息,go收到信息后,再由交給js寫出來,實際開發(fā)中用的就是此方法,前提是此信息不能過于頻繁交換或者流量過大。不知道其他人還有沒有更好的方法。

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2007-02-12 18:38 by emu
          總的來說,跨域我認為是瀏覽器開發(fā)者小心過頭的產(chǎn)物。一個合理的跨域限制策略應該是像flash那樣的,讀取一個crossdomain.xml配置文件后就允許或者拒絕訪問。
          Firefox的跨域訪問限制更惡心,一設置domain以后,連不跨域的請求都被禁止了,真是有病。

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2007-02-15 10:01 by bezy
          AJAX cross-domain js cross-domain 都可以解決的。。
          而且不需要通過后臺。。。。google ajax cross domian ..
          現(xiàn)在流行兩種解決方案。。。

          一種是 iframe 的橋接
          另一種是iframe 的代理

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2007-02-15 11:13 by itspy
          @bezy


          樓上的可以弄一個簡單的例子嗎?比如修改一下上面的示例,如何得到Google首頁的返回?

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2007-02-15 20:14 by TiGERTiAN
          了解。。。Iframe可以連接到外部的網(wǎng)頁而且沒有警告,然后通過js來獲取所需數(shù)據(jù)。。。
          現(xiàn)在好像Webservice可以解決cross-domain的調用。。就是不太知道如何使用

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2007-06-29 08:24 by newgo
          function hello() {
          var url = 'http://www.google.com';
          createXMLHttpRequest();
          xmlHttp.onreadystatechange = showResponse;
          xmlHttp.open("GET", url, true);
          xmlHttp.send(null);
          }

          url用'http://www.google.com';要改一下,不然連本地都顯示不了.

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例][未登錄]  回復  更多評論   

          2008-01-03 16:46 by ben
          一種是 iframe 的橋接 和 另一種是iframe 的代理 是什么意思?

          Webservice可以解決cross-domain的調用嘛?這么我的不行。。

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2008-06-26 13:43 by pudn
          防止跨域訪問,是為了防止服務器擁有者或黑客像其他網(wǎng)址提交本站用戶私有信息,如帳號和密碼

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2008-07-20 19:38 by chester
          不懂...url換成別的如baidu就可以了?為什么?

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例][未登錄]  回復  更多評論   

          2010-10-30 15:25 by k
          我也碰到這樣的問題 怎么解決呢

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例][未登錄]  回復  更多評論   

          2010-10-30 15:27 by k
          @emu
          贊同!

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2012-10-11 17:00 by 涂老
          jsonp

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2013-08-21 16:16 by sdf
          為什么我的不行呢?

          # re: 初步體驗“AJAX不能跨域訪問”(原創(chuàng))[有源碼,有示例]  回復  更多評論   

          2013-10-29 22:56 by 3a教程網(wǎng)

          ajax jsonp跨域的方法實例方法
          http://3aj.cn/article/4949.html
          主站蜘蛛池模板: 金沙县| 乌兰浩特市| 朝阳县| 郸城县| 通州市| 嘉荫县| 沁源县| 栾城县| 北票市| 新乐市| 永平县| 江安县| 巴南区| 古田县| 陵川县| 泾川县| 诏安县| 阿拉善左旗| 南投市| 江阴市| 同仁县| 临沂市| 玛曲县| 新平| 桦川县| 随州市| 观塘区| 无极县| 酉阳| 杭州市| 上杭县| 建宁县| 桂阳县| 水城县| 汨罗市| 江安县| 来安县| 玉树县| 栾川县| 洪江市| 克山县|