代码之家  ›  专栏  ›  技术社区  ›  EAMann

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

  •  1
  • EAMann  · 技术社区  · 14 年前

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

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

    我的第一个倾向是使用Silverlight,因为Silverlight4允许访问COM自动化。不幸的是,这只适用于 OOB (浏览器外)Silverlight应用程序-浏览器中的系统仍绑定在沙盒中,无法访问。

    那么,有哪些技术(框架、浏览器插件等)允许我从基于浏览器的Web应用程序中与USB/串行设备进行接口?各方面的优缺点是什么?

    3 回复  |  直到 14 年前
        1
  •  1
  •   x0n    14 年前

    我认为在这种情况下,你最好的选择可能是Java。USB,虽然是行业标准 协议 在裸金属实施方面绝对没有标准化。出于这个原因,对于您打算支持的每个不同的平台(Windows、Linux、OSX、BSD),您仍然需要一个不同的Java USB实现。当然,您还必须支付代码签名证书的费用,这样您就可以试着说服人们授予您的应用程序所需的访问权限;浏览器很难拒绝访问,而且当今和当今时代的大多数人都非常不愿意授予这种权限。也就是说,有一个旧的IBM文章在各种Java USB项目上进行了很好的阅读。祝你好运。

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

    -奥辛

        2
  •  1
  •   Mike Clark    14 年前

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

    Java没有内置的USB支持,所以您可能需要自己滚动。 JNI 与本机USB API的接口。

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

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

    JNI库和小程序可能存在一些类加载器问题。这些问题很微妙,很难解释。它们基本上与这样一个事实有关:一个JVM只能在每个VM实例上加载和绑定一个给定的JNI库一次,但是小程序会被实例化很多,通常使用它们自己的新类加载器,这可能是有问题的。Sun在 Next Generation Browser Plugin 可能已经解除了其中一些问题,但是如果用户使用Java1.60E10或更高版本,则用户只有此问题。

    也可以使用 JNA 在签名的小程序中。我不建议使用JNA直接访问USB API。但对于访问简单的本机函数,JNA有时可以节省大量时间。尽管一旦您建立了JNI基础设施,JNA的价值可能会降低。


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

    1. Java WebStask-可以从浏览器启动,但在浏览器之外运行
    2. Microsoft ClickOnce-可以从浏览器启动,但在浏览器外运行
    3. 闪光/空气-无法逃离它的沙箱
        3
  •  0
  •   EAMann    14 年前

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

    因此,只需构建一次,就可以运行,它编译成一个DLL,您可以在任意一个环境中部署:ActiveX for IE,NPAPI for Everyone Eleveryone。