2009-08-17 60 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; 
    }