在浏览器沙盒中运行时,签名java小程序是否可以访问USB外围设备?
我已经实现了一个Java软件包,它具有操作POS打印机和通过USB连接到工作站的现金抽屉的功能。我还实现了一个applet来利用这个包的功能,希望POS网站能够调用它 当小程序在Eclipse中运行时,一切都很顺利。从浏览器中运行小程序时,我的软件包似乎无法访问通过USB连接的外围设备。我从第三方(JavaPOS)代码中得到一个错误,说明: jpos.JposException:设备 通讯频道无法使用 已打开,请检查设备并重试 小程序是用自我证书签名的。我会发布一些代码,但错误是从使用中的POS打印机的制造商特定驱动程序中的某个地方抛出的 我假设问题是,在浏览器沙盒中,小程序无法访问通过USB连接的外围设备。在浏览器沙盒中运行时,签名java小程序是否可以访问USB外围设备?,java,applet,usb,javapos,Java,Applet,Usb,Javapos,我已经实现了一个Java软件包,它具有操作POS打印机和通过USB连接到工作站的现金抽屉的功能。我还实现了一个applet来利用这个包的功能,希望POS网站能够调用它 当小程序在Eclipse中运行时,一切都很顺利。从浏览器中运行小程序时,我的软件包似乎无法访问通过USB连接的外围设备。我从第三方(JavaPOS)代码中得到一个错误,说明: jpos.JposException:设备 通讯频道无法使用 已打开,请检查设备并重试 小程序是用自我证书签名的。我会发布一些代码,但错误是从使用中的POS
会是这样吗?如果是,是否仍可以从已签名的小程序中访问USB外围设备?
如果小程序无法访问USB外围设备,网站如何调用能够访问USB外围设备的代码?我不确定您的问题的答案,但有一个实验可以进一步阐明这一问题 在
Applet.init()
调用System.setSecurityManager(null)
的开头几行中。然后尝试连接到USB
- 如果小程序受信任,则对
的调用将成功,并删除setSecurityManager(null)
的最后剩余部分。(是的,即使是受信任的小程序也有一个安全管理器,只是沙盒应用程序的安全管理器的限制要小得多。)SecurityManager
- 如果现在发现USB,则表示受信任的安全管理器发生了更改。最近发生了许多这样的变化
请注意,我并不是建议将这样的代码投入生产。如果您的小程序与其他小程序运行在相同的JRE中,取消SM也可能会提升其他小程序的权限。我收到了Star Micronics团队的反馈,他们的“…javapos驱动程序不支持web浏览器打印。”
顺便说一句,System.setSecurityManager(null)被证明是消除我遇到的任何似乎与安全性有关的问题的一个很好的方法。谢谢Andrew。我在XP和Win7 32位上使用JRE 1.6的Epson TM-H6000III时遇到了类似的问题。管理员可以使用该设备,但“用户”不能。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很快就解决了这个问题
在浏览器沙盒中运行时,签名java小程序是否可以访问USB外围设备
为了解决这个特定的问题(并避免以下评论中涉及的特定技术),有签名的Java小程序可以访问USB外围设备。“沙盒”是您在运行已签名的小程序时能够“突破”的功能
但出于安全原因,简单地对applet进行签名并不会自动授予对沙箱之外项目的访问权限
privilegedaction
似乎是访问特权系统组件(如打印机)的首选方法。Oracle在此处提供了有关这些特权操作的更多信息:
此外,当从web浏览器执行类似操作时,有几个考虑因素,因为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()调用)调用时被阻止:
为了避免这个问题,有些人选择使用privilegedaction
,但是如果操作需要很长时间,您会注意到它会阻塞UI,这在网页中是非常糟糕的做法(并且会使浏览器死锁)
此外,您的问题特别询问如何访问USB外围设备,这通常通过迭代人机界面设备来完成。HID并不是Java直接在本机上支持的东西(但在编写本/JRE7时)。因此,是的,一个签名的小程序可以与您的USB外围设备通信,但是您需要使用某种形式的Java本机接口(JNI)来正确地“访问”它们。JNI支持跨平台(即使用JAR分发DLL和SOs)可能会很混乱,所以
大多数Java小程序所做的是访问本地安装的打印机并使用标准Java打印库。qz print项目就是这样做的,您可以在这里自由查看我们的源代码:它使用init()和布尔标志触发的线程来触发所有特权函数。Bozho似乎这么认为:(我不认为这是一个重复的问题——其他人可能——但我认为这对您有帮助).听起来问题中的用户自己在编写驱动程序。我正在调用一个现有的驱动程序,所以我不相信在我的例子中包含一个USB API的.jar会有帮助。谢谢,谢谢你的建议。但是,我在尝试访问外围设备之前调用setSecurityManager(null)时得到了相同的结果。
var myapplet = document.getElementById('myapplet');
myapplet.writeFile(); // Blocked by Security Framework
public void init() {
...
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
writeFile();
return null;
}
});
...
}