【问题标题】:How do I "break out" of the browser's sandbox?如何“突破”浏览器的沙箱?
【发布时间】:2011-05-12 05:45:35
【问题描述】:

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

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

我的第一个想法是使用 Silverlight,因为 Silverlight 4 授予对 COM 自动化的访问权限。不幸的是,这仅适用于 OOB(浏览器外)Silverlight 应用程序 - 浏览器内系统仍绑定在沙盒中且无权访问。

那么,存在哪些技术(框架、浏览器插件等)可以让我在基于浏览器的 Web 应用程序中与 USB/串行设备进行交互?各有什么优缺点?

【问题讨论】:

  • 你的标题在这里不太合适。您不应该试图“破坏”浏览器的沙箱。您应该使用适当的 API 来授予对您的应用程序的信任(如果您想要 x 平台,则使用 JVM/java)

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    Java 没有内置 USB 支持,因此您可能需要将自己的 JNI 接口滚动到原生 USB API。

    在小程序中使用 JNI 可能会很棘手。我以前做过。如果您在 Google 上搜索该主题,大多数结果都会显示“不要这样做”或“你不能这样做”。嗯,你可以的。

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

    JNI 库和小程序可能存在一些 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 - 无法逃脱其沙盒

    【讨论】:

      【解决方案3】:

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

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

      -奥辛

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-27
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 2018-05-28
        • 2011-11-30
        相关资源
        最近更新 更多