签名的 Java 小程序在浏览器沙箱中运行时是否可以访问 USB 外围设备?
为了解决这个特定问题(并避免后面的 cmets 中涉及的特定技术),是的,签名 Java 小程序可以访问 USB 外围设备。 “沙盒”是您在运行已签名的小程序时能够“突破”的地方。
但出于安全原因,简单地签署小程序并不会自动授予对沙盒外项目的访问权限。
PrivelegedAction 似乎是访问特权系统组件(例如打印机)的首选方法。 Oracle 在此处提供了有关这些特权操作的更多信息:http://docs.oracle.com/javase/7/docs/api/java/security/AccessController.html
此外,从网络浏览器执行此类操作时有几个考虑因素,因为 Java 关心操作的来源。
public function writeFile() {
...
FileWriter fw = new FileWriter(...);
...
}
public void init() {
writeFile();
}
例如,如果您要在 applet init() 方法中使用 FileWriter 类将文件写入文件系统(即 $HOME/Desktop/text.txt),则签名 Applet通常会允许这样做.将其包装成 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 本身直接支持的东西(然而,在编写此/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() 触发的线程和布尔标志来触发所有特权函数。