隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導航

          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          公告

          關注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團隊

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務

          代理網站

          關注的網站

          協議

          喜歡的Blog

          國內廣告平臺

          圖書出版

          在線培訓

          開發工具

          微博客戶端

          手機鈴聲

          操作系統

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統

          數學

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學習

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1974942
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          在Firefox中通過AJAX跨域訪問Web資源

          本文為原創,如需轉載,請注明作者和出處,謝謝!

          一、解決在firefox中無法跨域訪問的問題

          AJAX從本質上講就是命名用XMLHttpRequest組件來向服務端發送HTTP請求,請接收相應信息。至于成功接收到響應信息后的操作,就和普通的Web客戶端程序類似了(一般用DOM將信息加到HTML組件中)。但問題就發生在了XMLHttpRequest組件上。雖然在大多數瀏覽器中(包括IEFirefox等)都叫這個名子。使用方法也類似。但在進行某些操作時卻有不同的效果。

          就拿跨域訪問的問題來說。讓我們先看看如下的html中的javascript代碼:

          test.html


          <html>
              
          <head>
                  
          <title></title>
                  
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <script type="text/javascript"> 

          // 獲得IE和firefox瀏覽器中的XMLHttpRequest對象
          function getXMLHTTPRequest()
          {
              var myRequest = null;
              if(window.XMLHttpRequest)   // firefox
              {        
                  myRequest 
          = new XMLHttpRequest(); 
              }
              else if(typeof ActiveXObject != "#ff0000")  // IE
              {              
                  myRequest 
          = new ActiveXObject("Microsoft.XMLHTTP");
              }          
              return myRequest;          
          }

          var myRequest;
          function onReadyState()   // XMLHttpRequest處理異步訪問狀態時的事件
          {
              if(myRequest.readyState == 4)   // 4表示成功獲得相應信息
              {              
                  var msg = document.getElementById("msg");
                  msg.value 
          = myRequest.responseText             
              }
          }
          function getServiceText()
          {     
              myRequest 
          = getXMLHTTPRequest();
              if(myRequest)
              {         
                  myRequest.onreadystatechange 
          = onReadyState;      
                  try 
                  {
                      myRequest.open( 
          "post""http://www.aygfsteel.com"true);
                  }
                  catch(exception)
                  {
                     
          var msg = document.getElementById("msg");
                      msg.value 
          = exception;  
                   } 
                   myRequest.send(
          "test");
              }         
          }

          </script>
              
          </head>
              
          <body>
                  
          <input id="msg" type="text" />
                  
          <input type="button" value="信息" onclick="getServiceText()" />
              
          </body>
          </html>

          如果在IE中訪問上面的html文件,url如下:

          http://localhost:8080/test.html

          會彈出一個對話框,大概意思是說您已經跨域訪問了,可能存在風險,是否繼續。如果繼續執行的話,仍然可以訪問http://www.aygfsteel.com。但是在firefox中卻更本無法訪問其它域的url,并且會拋出“調用方法 XMLHttpRequest.open 時權限不足”異常。解決的方法一般有兩種,一種是修改firefox的設置,在firefox的地址欄中輸入“about:config”,并找到signed.applets.codebase_principal_support,將其設為true。如圖1所示。


                                                                

                                                   圖1

          但這種方法經過實現,仍然無法訪問其他域的url,不知是不是新版的firefox把這個給屏蔽了。就算這種方法可行,也盡量不使用這種需要配置firefox的方法,而要使用編程的方法,在訪問其它域之前,可以使用如下代碼打開權限:

          try 

              netscape.security.PrivilegeManager.enablePrivilege(
          "UniversalBrowserRead"); 
          }
          catch (exception)

              alert(exception); 
          }

          要注意的是,上面的代碼只能用在firefox中,因此,要將其放到只有firefox才能執行到的代碼塊中,如在下面的塊中:

          if(window.XMLHttpRequest)   // firefox
          {        
              
          try 
              { 
                  netscape.security.PrivilegeManager.enablePrivilege(
          "UniversalBrowserRead"); 
              }
              
          catch (exception)
              { 
                  alert(exception); 
              }
          }


              不能將上面的代碼放到getXMLHTTPRequest中,應放到getServiceText中。

          注:如果test.html在通過web服務器訪問,而是按著訪問本地文件時訪問test.html時,在IE中不會出現上述的提示對話框,而是直接就可以訪問其他的域。

          二、其他的跨瀏覽器問題

           

          不同瀏覽器的XMLHttpRequest雖然接口一樣,但在不同瀏覽器中調用XMLHttpRequest的方法和屬性的效果不同。如send方法,在IE中可以不傳參數,如myRequest.send();仍然可以正常工作,而在firefox中,必須為send方法傳一個參數,也就是說,在firefoxsend方法參數沒有默認值,必須為其賦值。為了通用起見,建議所有的send方法都為其賦一個參數值,哪怕是空串。

          除了send方法,responseText屬性也是一樣,在IE中,responseText返回了整個web資源的內容,而在firefox中只返回web資源的第一行。





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-05-15 16:46 銀河使者 閱讀(9351) 評論(6)  編輯  收藏 所屬分類: ajaxjavascriptweb 原創

          評論

          # re: 在Firefox中通過AJAX跨域訪問Web資源[未登錄]  回復  更多評論   

          沒技術含量的文章
          2008-05-16 11:33 | a

          # re: 在Firefox中通過AJAX跨域訪問Web資源  回復  更多評論   

          火狐用的人還是太少
          2008-05-16 12:15 | 網上買書

          # re: 在Firefox中通過AJAX跨域訪問Web資源  回復  更多評論   

          現在國內已經有很多人用firefox了,但在國外很多。哈哈,我現在一直用firefox。自從用了以后,再沒中過基于web轉播的病毒。-^-
          2008-05-16 12:20 | 銀河使者

          # re: 在Firefox中通過AJAX跨域訪問Web資源  回復  更多評論   

          @網上買書
          不用Firefox的人大多都是不知道Firefox的人
          2008-05-16 12:59 | lvq810

          # re: 在Firefox中通過AJAX跨域訪問Web資源[未登錄]  回復  更多評論   

          有用~但是還有沒有別的辦法?ff彈出那個會嚇到用戶滴
          2008-11-24 10:51 | ak

          # 也可以在服務器上做個中轉 這樣可能更好控制  回復  更多評論   

          還有一個辦法就是在當前域的服務器上做一個對外域訪問的"網關" 比如用Java寫個Servlet 然后 Ajax請求到這個Servlet上 把要訪問的外域地址和方式(POST/GET)以及訪問參數都作為傳遞給這個Servlet的請求參數
          這個Servlet再通過URLConnection去訪問外域獲取內容并回傳給本域請求的XHR 起到一個"網關"的作用
          這樣就不存在Ajax直接訪問外域的問題了
          2009-02-09 17:53 | 逝水fox
          主站蜘蛛池模板: 全南县| 龙里县| 高密市| 庄河市| 万盛区| 郁南县| 虹口区| 策勒县| 乌什县| 建宁县| 兴义市| 潞城市| 建始县| 剑河县| 庆阳市| 黑龙江省| 阆中市| 辽阳市| 贵溪市| 遂平县| 双流县| 蓬安县| 临高县| 潮州市| 永安市| 化德县| 静安区| 南投市| 阿克陶县| 平陆县| 志丹县| 汝阳县| 巴马| 龙门县| 离岛区| 栾川县| 志丹县| 通化市| 鄱阳县| 嘉黎县| 柞水县|