Имеют ли подписанные Java-апплеты доступ к периферийным устройствам USB при запуске в изолированной программной среде браузера?
Чтобы ответить на этот конкретный вопрос (и избежать использования специальных технологий, связанных с комментариями ниже), даПодписанные 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();
}
Например, если вы хотите записать файл в файловую систему (т. Е. $HOME/Desktop/text.txt
), используя класс FileWriter
в методе апплета init (), подписанный апплет обычно разрешит это,Было бы лучше обернуть это в PrivilegedAction
, и проверка разрешения сначала с использованием AccessController.checkPermission(...)
была бы идеальной.
Однако FileWriter
блокируется, когда вызывается непосредственно из JavaScript (а не из init ()):
var myapplet = document.getElementById('myapplet');
myapplet.writeFile(); // Blocked by Security Framework
Чтобы обойти эту проблему, некоторые решили использовать PrivelegedAction
, однако, если действие занимает много времени, вы заметите, что оно блокирует пользовательский интерфейс, что является очень плохой практикой на веб-странице.(и может заблокировать браузер).
public void init() {
...
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
writeFile();
return null;
}
});
...
}
Кроме того, ваш вопрос конкретно касается доступа к периферийному устройству USB, что обычно делается путем итерации через устройства интерфейса пользователя.HID - это не то, что Java поддерживает напрямую (пока на момент написания этого / JRE7).Так что да, подписанный апплет МОЖЕТ общаться с вашими периферийными устройствами USB, но вам потребуется использовать некоторую форму Java Native Interfacing (JNI) для правильного «доступа» к ним.JNI может быть беспорядком для поддержки кроссплатформенности (т.е. распространения DLL и SO с вашим JAR), так что ...
То, что делает большинство апплетов Java, - это доступ к локально установленным принтерам и использование стандартных библиотек печати Java.Вот как мы это делаем в проекте qz-print, и вы можете просмотреть наш исходный код здесь: https://github.com/qzindustries/qz-print/tree/master/qz-print/src/qz, который использует потоки, запускаемые init () и логическими флагами, для запуска всех привилегированных функций.