
在浏览器沙箱中运行时,签名的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标志触发的线程来触发所有特权函数。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)