如何“突破”浏览器的沙箱?

时间:2010-11-18 19:12:19

标签: silverlight web-applications cross-browser activex cross-platform

我需要创建一个Web控制的应用程序(在浏览器中,它可以连接到通过USB或串口连接的设备并从中读取数据。

目前,我正在使用ActiveX控件来执行此操作。但是,我想重新编写这个系统,使其跨浏览器(支持Firefox)并最终跨平台(支持Mac上的Safari)。 ActiveX既不是跨浏览器也不是跨平台,所以我正在寻找替代技术。

我的第一个倾向是使用Silverlight,因为Silverlight 4允许访问COM Automation。不幸的是,这仅适用于 OOB (浏览器外)Silverlight应用程序 - 浏览器内系统仍然绑定在沙箱中,无法访问。

那么,有哪些技术(框架,浏览器插件等)可以让我在基于浏览器的Web应用程序中与USB /串行设备连接?每个人的利弊是什么?

3 个答案:

答案 0 :(得分:1)

我认为在这种情况下,最好的选择可能是Java。 USB虽然是协议方面的行业标准,但在裸机实现方面肯定没有标准化。因此,对于您打算支持的每个不同平台(windows,linux,osx,bsd),您仍然需要不同的Java USB实现。当然,您还需要为代码签名证书付费,这样您就可以试图说服人们为您的应用程序授予其所需的访问权限;浏览器非常努力拒绝访问的东西,这个时代的大多数人都非常不愿意这样做。也就是说,这里有一篇关于各种Java USB项目的旧IBM文章,可以很好地阅读。祝你好运。

http://www.ibm.com/developerworks/library/j-usb.html

-Oisin

答案 1 :(得分:1)

可能会很痛苦,但您可以使用 signed Java applet 。签名的Java小程序可以完全访问用户的系统。

Java没有内置USB支持,因此您可能需要将自己的JNI接口转换为本机USB API。

在applet中使用JNI可能很棘手。我以前做过。如果你谷歌这个主题,大多数结果说“不要做”或“你做不到”。好吧,你可以做到。

我是这样做的:我在applet的JAR中打包了本机库(DLL,等等),然后使用例如JAR从JAR中读取本机库。的 getResourceAsStream 即可。然后我将库写到磁盘上的适当位置(例如$ {user.home} / .myapp /。)然后我使用 System.load 来加载JNI DLL。

JNI库和applet可能存在一些ClassLoader问题。这些问题很微妙,很难解释。它们基本上与JVM只能为每个VM实例加载和绑定给定JNI库一次这一事实有关,但是applet经常使用他们自己的新ClassLoader进行实例化,这可能会有问题。 Sun在Next Generation Browser Plugin中对流程分离所做的工作可能已经解决了其中的一些问题,但是如果用户使用的是Java 1.6.0_10或更高版本,那么您的用户将只会这样做。

也可以在已签名的小程序中使用JNA。我不建议使用JNA直接访问USB API。但是JNA有时可以节省大量时间来访问简单的本机函数。虽然一旦你设置了JNI基础设施,JNA的价值可能就会降低。


以下是其他一些随意的想法:

  1. Java WebStart - 可以从浏览器启动,但可以在浏览器外部运行
  2. Microsoft ClickOnce - 可以从浏览器启动,但在浏览器外部运行
  3. Flash / AIR - 无法逃脱其沙箱

答案 2 :(得分:0)

到目前为止,我遇到的最佳解决方案是名为FireBreath的跨浏览器/跨平台插件系统。这是一个用C ++构建的框架,允许您从同一代码库生成ActiveX和NPAPI 的插件

所以构建它一次,使其工作,并编译为一个可以在任一环境中部署的DLL:用于IE的ActiveX,用于其他所有人的NPAPI。