在瀏覽器沙箱中運行時,簽名的java applets是否可以訪問USB外設?
爲了解決這個特定的問題(並避免以下評論中涉及的特定技術),是簽名Java小程序可以訪問USB外設。當你運行一個簽名的applet時,「沙箱」就是你能夠「突破」的能力。
但出於安全原因,只需對小程序進行簽名就不會自動授予對沙箱外項目的訪問權限。
PrivelegedAction
似乎是訪問特權系統組件(如打印機)的首選方法。 Oracle在這裏提供了更多關於這些特權操作的信息:http://docs.oracle.com/javase/7/docs/api/java/security/AccessController.html
另外,當從Java瀏覽器執行類似操作時需要考慮一些因爲Java關心動作起源於何處。
public function writeFile() {
...
FileWriter fw = new FileWriter(...);
...
}
public void init() {
writeFile();
}
例如,如果你使用在小程序init()方法的FileWriter
類寫一個文件到文件系統(即$HOME/Desktop/text.txt
),已簽名的Applet將通常允許它。將它包裝成PrivilegedAction
會更好,並且首先使用AccessController.checkPermission(...)
檢查許可將是理想的。
然而,當它從JavaScript(而不是由init())直接調用FileWriter
被阻止:
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時)。所以是的,一個已簽名的小程序CAN可以與您的USB外設通信,但您需要使用某種形式的Java本地接口(JNI)來正確「訪問」它們。 JNI可能是一個混亂,以支持跨平臺(即分發DLL和SO與您的JAR),所以...
大多數Java Applets做的是訪問本地安裝的打印機和使用標準的Java打印庫。這就是我們在qz-print項目中的做法,您可以在這裏查看我們的源代碼:https://github.com/qzindustries/qz-print/tree/master/qz-print/src/qz它使用由init()和布爾型標誌觸發的線程來激發所有特權函數。
Bozho似乎這樣認爲:http://stackoverflow.com/questions/2093707/java-applet-with-usb-access-in-windows-and-linux/2093863#2093863(我不認爲這是這個問題的重複 - 其他人可能 - 但我認爲這對你很有幫助)。 – 2011-04-17 15:24:21
這個問題中的用戶聽起來像是自己寫驅動程序。我正在調用一個現有的驅動程序,所以我不相信包括USB API的.jar會對我有幫助。不過謝謝。 – tQuarella 2011-04-19 00:25:14