当前位置: 首页 > 面试题库 >

在浏览器沙箱中运行时,签名的Java Applet是否可以访问USB外设?

夏侯嘉荣
2023-03-14
问题内容

我已经实现了一个Java软件包,该软件包具有操作POS打印机和通过USB连接到工作站的现金抽屉的功能。我还实现了一个applet,以利用此软件包的功能,希望可以由POS网站调用该applet。

当从Eclipse内部运行applet时,一切顺利。当从浏览器中运行小程序时,我的程序包似乎无法访问通过USB连接的外围设备。我从第三方(JavaPOS)代码中得到了一个错误,指出:

jpos.JposException:无法打开设备通信通道,请检查设备并重试。

小程序已通过自认证进行签名。我会发布一些代码,但错误是从埋在使用中的POS打印机的制造商特定驱动程序中的某个地方引发的。

我假设问题是从浏览器沙箱内部,小程序无法访问通过USB连接的外围设备。
可能是这样吗?如果是这样,是否可以从已签名的Applet中访问USB外设?
如果小程序无法访问USB外设,那么网站如何调用可以的代码?


问题答案:

在浏览器沙箱中运行时,签名的Java Applet是否可以访问USB外设?

为解决此特定问题(并避免使用以下注释中涉及的特定技术),可以,已签名的Java
Applet可以访问USB外围设备。当您运行签名的小程序时,“沙箱”就是您可以“突围”的功能。

但是出于安全原因,仅对applet签名并不能自动授予对沙箱外部项目的访问权限。

PrivelegedAction似乎是访问特权系统组件(例如打印机)的首选方法。Oracle在此处提供了有关这些特权操作的更多信息:http
:
//docs.oracle.com/javase/7/docs/api/java/security/AccessController.html

另外,在Web浏览器中执行此类操作时还需要考虑一些因素,因为Java会关注操作的来源。

public function writeFile() {
    ...
    FileWriter fw = new FileWriter(...);
    ...
}


public void init() {
    writeFile();
}

例如,如果您要$HOME/Desktop/text.txt使用FileWriterapplet
init()方法中的类将文件写入文件系统(即),则Signed Applet 通常会 允许它。将其包装为a
PrivilegedAction会更好,并且首先使用权限检查AccessController.checkPermission(...)是理想的。

但是,FileWriter直接从JavaScript(而不是从init())直接调用时会被阻塞:

var myapplet = document.getElementById('myapplet');
myapplet.writeFile(); // Blocked by Security Framework

为了避开此问题,有人选择使用PrivelegedAction,但是,如果操作花费很长时间,您会注意到它阻止了UI,这在网页中是非常不好的做法(并且可能使浏览器死锁)。

public void init() {
   ...
   AccessController.doPrivileged(new PrivilegedAction() {
      public Object run() {
         writeFile();
         return null;
      }
   });
   ...
}

此外,您的问题专门询问有关访问USB外围设备的信息,这通常是通过遍历人机界面设备来完成的。HID并不是Java本身直接支持的东西(但是,截至编写this /
JRE7为止)。因此,可以,一个签名的applet可以与您的USB外设通信,但是您将需要使用某种形式的Java Native
Interface(JNI)来正确地“访问”它们。JNI支持跨平台(即通过JAR分发DLL和SO)可能会一团糟。

大多数Java Applet所做的是访问本地安装的打印机并使用标准的Java打印库。这就是我们在qz-
print项目中所做的工作,您可以在此处自由查看我们的源代码:https : //github.com/qzindustries/qz-
print/tree/master/qz-print/src/qz它使用由init()和boolean标志触发的线程来触发所有特权函数。



 类似资料:
  • 问题内容: 我正在寻找一种在客户端(即在浏览器中)进行traceroute的方法。 据我所知,不可能通过Javascript或Flash发送具有任意TTL值的ICMP,UDP或TCP数据包。我知道Flash允许通过Actionscript中的Socket类进行TCP连接,但是它对于traceroute实现似乎没有用。 是开发浏览器插件的唯一解决方案吗? 编辑 :我刚刚发现它已经用Java小程序完成

  • 问题内容: 我正在使用Selenium RC自动执行一些浏览器操作,但我希望浏览器不可见。这可能吗?怎么样?selenium网格呢?我也可以隐藏Selenium RC窗口吗? 问题答案: 有几种选择: 您可以使用Selenium Grid,以便在完全不同的计算机(或虚拟机)上打开浏览器,然后如果您想查看浏览器,则可以通过VNC或远程桌面连接连接到该计算机。另外,还有一个选择:如果在该远程服务器上运

  • 问题内容: 我用Yeoman的应用程序启动了Angular.js应用程序,其中包括Karma测试。然后,合理的失败是因为Karma无法找到任何浏览器。(尚未在应用程序的node_modules / karma配置文件中设置。) 我正在通过SSH在远程计算机上进行开发,我认为(如果我错了,请告诉我)安装Chrome毫无意义。 那么有可能在没有任何浏览器的情况下运行Karma吗? 问题答案: 业力 需

  • 问题内容: 假设我在使用Java 8类型注释的类中具有以下成员: 是否可以在运行时使用反射读取在String类型上使用的给定注释?如果是这样,将如何进行? 更新:这是注释类型的定义: 问题答案: 是的,有可能。表示这种结构的反射类型称为。这是如何获取注释的示例:

  • 我想检查angular在生成浏览器应用程序包时是否存在lint错误,如果存在错误则失败。 可能吗?我用恶魔创造了一个手表,但这不是我要找的。。。这 非常感谢。

  • Mocha在浏览器中运行。每个版本的Mocha都将拥有新版本./mocha.js并./mocha.css在浏览器中使用。 特定于浏览器的方法 以下方法仅在浏览器上下文中起作用: mocha.allowUncaught() :如果被调用,错误处理程序将不会吸收未捕获的错误。 典型的设置可能类似于下面,我们呼吁mocha.setup('bdd')使用BDD加载测试脚本,运行之前的界面onload与mo