2009-08-17 63 views
6

我有一組使用JavaScript的HTML文件來生成導航工具,索引,TOC等。這些文件只能在本地打開(例如,file://)並且不能在Web服務器上提供。如何在打開本地文件時繞過document.domain限制?

Error: Permission denied for <file://> to get property Location.href from <file://>. 

我明白,這是由於FF 3.X內安全措施是:自的Firefox 3.x,我們點擊一​​個導航按鈕,將生成的TOC一個新的幀時遇到以下錯誤不是在2.x中,因爲document.domain不匹配,所以它假設這是跨站點腳本並拒絕訪問。

有沒有辦法解決這個問題?也許只是一個在Firefox中關閉/打開的開關?一些JavaScript代碼來解決它?

回答

1

在Firefox:

  1. 在地址欄中輸入about:config中,
  2. 然後在搜索欄中鍵入network.automatic-NTLM身份auth.trusted-URI的
  3. 輸入逗號分隔的列表的 服務器(即 內聯網,家庭,公司)

另一種方式是編輯users.js。

在users.js,寫:

user_pref("capability.policy.policynames", "localfilelinks"); 
user_pref("capability.policy.localfilelinks.sites", "http://site1.com http://site2.com"); 
user_pref("capability.policy.localfilelinks.checkloaduri.enabled", "allAccess"); 

但是,如果你要停止所有驗證,只寫以下行users.js文件:

user_pref("capability.policy.default.checkloaduri.enabled", "allAccess"); 
+0

這似乎是你會爲服務器上的文件服務器做什麼,但是我通過file訪問的那些內容://哪裏沒有域? – Gudlyf 2009-08-17 20:21:37

+0

此解決方案適用於您有網站(託管在某處)的情況,並且需要讀取客戶端硬盤驅動器中的某些文件。另一種解決方案是關閉這項政策(我編輯了我的答案,如何做到這一點) - 我認爲你明白:) – Cleiton 2009-08-17 21:21:30

+0

這不適合我在Firefox 11下工作。我已經在正確的配置文件目錄中使用user.js並且我試過直接從about:config輸入它。網址是「http:// localhost」。 – Michael 2012-04-22 17:42:03

0

裏貝羅的方法進行工作你自己或任何你期望的用戶都將經歷這個手動過程(除非這是你和你的同事的工具或其他東西)。

我倒是希望這種類型的東西會不會可能,因爲如果是這樣,這意味着任何站點那裏可以開始我的機器和閱讀其內容上的開放文檔。

0

您可以將所有要在子文件夾中訪問的文件都與正在執行請求的頁面相關聯。

您還可以使用JSONP從任何地方加載文件。

+0

JSONP可以用於文件協議嗎?這不是一種修辭;我其實很好奇。 – Matchu 2009-08-22 13:15:28

+0

如果您的數據位於file://mydata.jsonp 並且它看起來像callback = {data:「hello」} 您可以使用JSONP來請求該數據。 – 2009-08-22 19:51:30

-1

添加 「文件://」,以network.automatic-NTLM身份auth.trusted-URI的在about:config中

1

你可以使用這個在Firefox中讀取文件。

function readFile(arq) { 
     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
     var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); 
     file.initWithPath(arq); 

     // open an input stream from file 
     var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); 
     istream.init(file, 0x01, 0444, 0); 
     istream.QueryInterface(Components.interfaces.nsILineInputStream); 
     var line = {}, lines = [], hasmore; 
     do { 
      hasmore = istream.readLine(line); 
      lines.push(line.value); 
     } while(hasmore); 
     istream.close(); 
     return lines; 
    }