在浏览器沙箱中运行时,签名的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
使用FileWriter
applet init()方法中的类将文件写入文件系统(即),则Signed 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本身直接支持的东西(但是,截至编写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标志触发的线程来触发所有特权函数。