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

| 我已经实现了Java软件包,该软件包具有操作POS打印机和通过USB连接到工作站的现金抽屉的功能。我还实现了一个applet,以利用此程序包的功能,并希望由POS网站调用它。 当小程序从Eclipse中运行时,一切顺利。当从浏览器中运行小程序时,我的程序包似乎无法访问通过USB连接的外围设备。我从第三方(JavaPOS)代码中得到了一个错误,指出:   jpos.JposException:设备   通讯渠道无法   打开,检查设备,然后重试。 小程序已通过自认证进行签名。我会发布一些代码,但是错误是从埋在使用中的POS打印机的制造商特定驱动程序中的某个位置引发的。 我以为问题是从浏览器沙箱内部,小程序无法访问通过USB连接的外围设备。 可能是这样吗?如果是这样,是否可以从已签名的Applet中访问USB外设? 如果小程序无法访问USB外设,那么网站如何调用可以的代码?     
已邀请:
  在浏览器沙箱中运行时,签名的Java Applet是否可以访问USB外设? 为了解决此特定问题(并避免使用以下注释中涉及的特定技术),可以,已签名的Java Applet可以访问USB外围设备。当您运行签名的小程序时,“沙箱”是您具有“突围”的能力。 但是出于安全原因,仅对applet签名并不能自动授予对沙箱外部项目的访问权限。 “ 0”似乎是访问特权系统组件(例如打印机)的首选方法。 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();
}
例如,如果要使用applet init()方法中的
FileWriter
类将文件写入文件系统(即
$HOME/Desktop/text.txt
),则Signed Applet通常会允许它。将其包装为
PrivilegedAction
会更好,最好先使用
AccessController.checkPermission(...)
检查权限。 但是,直接从JavaScript(而不是从init())直接调用
FileWriter
时会被阻止:
var myapplet = document.getElementById(\'myapplet\');
myapplet.writeFile(); // Blocked by Security Framework
为了避免这个问题,有些人选择使用“ 0”,但是,如果操作花费很长时间,您会注意到它阻止了UI,这在Web页面中是非常不好的做法(并且可能使浏览器死锁)。
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标志触发的线程触发所有特权函数。     
我不确定您所提问题的答案,但是有一个实验可以进一步阐明这个问题。 在
Applet.init()
的开头行中,请呼叫
System.setSecurityManager(null)
。然后尝试连接到USB。 如果小应用程序是受信任的,则对ѭ12the的调用将成功,并删除
SecurityManager
的最后残余。 (是的,即使是受信任的applet也具有安全管理器,对于沙盒应用程序的安全管理器的限制要少得多。) 如果现在发现USB,则表明受信任的安全管理器已更改。最近发生了许多这样的变化。 请注意,我不建议将这样的代码投入生产。如果您的小程序与其他小程序在同一JRE中运行,则使SM无效也可以提升其他小程序的特权。     
我在XP和使用JRE 1.6的Win7 32bit上的Epson TM-H6000III遇到类似的问题。管理员可以使用该设备,但\“ Users \”不能使用。 Java控制台正在报告:
Sep 23, 2011 3:38:47 PM com.xxxx.printer.epson.EpsonPrinter findPrinter
INFO: Error opening PrinterIII: jpos.JposException: 
    Could not connect to service with logicalName = 
    PrinterIII: Exception.message=Property or stream open error.
看来JRE安装存在权限问题。重新安装JRE可以很快解决问题。     
我收到了Star Micronics团队的反馈,说他们的“ ... javapos驱动程序不支持Web浏览器打印。” 顺便说一句,事实证明System.setSecurityManager(null)是消除我遇到的与安全性相关的任何问题的好方法。谢谢安德鲁。     

要回复问题请先登录注册