<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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



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

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


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

    ?

    分析1:為什么好好的頁面卻得不到期望的結果:
    為什么JS語法沒有什么問題,放在網絡鄰居與web容器中就不能正常運行了呢,這就是AJAX所說的不能跨域訪問,因為瀏覽器你這個JS程序是來自容器,它就限制你只能正常訪問同一容器里的的資源[注:2],比如你通過http://www.openj.cn訪問到一個頁面,那么這個頁面的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 = 'http://www.google.com';??? 你可以把它修改為任何你能訪問的地址,
    [5]:本文的內容全是自己的瞎體會的,如果有什么不對的有高手發現了,希望大家能指出。這也是本文的主要目的。




    ?

    <!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不能跨域訪問”(原創)[有源碼,有示例]  回復  更多評論   

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

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

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

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

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

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

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

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


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

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

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

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

    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不能跨域訪問”(原創)[有源碼,有示例][未登錄]  回復  更多評論   

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2013-10-29 22:56 by 3a教程網

    ajax jsonp跨域的方法實例方法
    http://3aj.cn/article/4949.html
    主站蜘蛛池模板: 中国在线观看免费高清完整版| 中文字幕久无码免费久久| 久久精品免费观看| 成人午夜亚洲精品无码网站| 日本一区二区三区在线视频观看免费 | 国产成人免费AV在线播放 | 日韩免费视频播放| 亚洲av午夜精品无码专区| 日本视频在线观看永久免费| 亚洲AV永久无码精品成人| 最近免费中文字幕中文高清 | 国产无遮挡又黄又爽免费视频| 亚洲无mate20pro麻豆| 成年美女黄网站色大免费视频| 亚洲www77777| 国产精品国产自线拍免费软件| 国产成人精品久久亚洲高清不卡| 最好免费观看韩国+日本 | 激情吃奶吻胸免费视频xxxx| 亚洲一区二区高清| 久久国产免费一区二区三区| 亚洲午夜精品一区二区公牛电影院| 在线看片v免费观看视频777| 亚洲国产精品嫩草影院| 亚洲成人高清在线| 男人都懂www深夜免费网站| 亚洲国产成人精品久久| 天堂在线免费观看中文版| 人体大胆做受免费视频| 色拍自拍亚洲综合图区| 妞干网免费观看视频| 国产精品玖玖美女张开腿让男人桶爽免费看 | 日产乱码一卡二卡三免费| 一级毛片免费不卡直观看| 久久久久亚洲AV成人无码| 无码人妻久久一区二区三区免费丨| 亚洲AV无码国产精品永久一区| 亚洲AV无码乱码精品国产| 免费在线黄色电影| 亚洲中文字幕无码久久| 好看的亚洲黄色经典|