在浏览器沙箱中运行时,签名的 Java 小程序是否可以访问 USB 外围设备?
为了解决这个特定问题(并避免以下评论中涉及的特定技术),是的,签名 Java 小程序可以访问 USB 外围设备。“沙盒”是您在运行签名的小程序时能够“突破”的地方。
但出于安全原因,简单地签署小程序并不会自动授予对沙箱外项目的访问权限。
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();
}
例如,如果您要使用applet init() 方法中$HOME/Desktop/text.txt
的类将文件写入文件系统(即)FileWriter
,则签名Applet通常会允许这样做。将其包装成 aPrivilegedAction
会更好,并且首先使用检查权限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 本身直接支持的东西(然而,在编写此/JRE7 时)。所以是的,一个签名的小程序可以与您的 USB 外围设备对话,但您需要使用某种形式的 Java 本机接口 (JNI) 来正确“访问”它们。JNI 支持跨平台(即用你的 JAR 分发 DLL 和 SO)可能是一团糟,所以......
大多数 Java 小程序所做的是访问本地安装的打印机并使用标准的 Java 打印库。这就是我们在 qz-print 项目中的做法,您可以在这里查看我们的源代码: https ://github.com/qzindustries/qz-print/tree/master/qz-print/src/qz它使用由 init() 和布尔标志触发的线程来触发所有特权函数。