Имеют ли подписанные Java-апплеты доступ к периферийным устройствам USB при запуске в изолированной программной среде браузера? - PullRequest
2 голосов
/ 17 апреля 2011

Я реализовал пакет Java с функциями для работы POS-принтера и кассового ящика, подключенного к рабочей станции через USB.Я также реализовал апплет для использования функциональности этого пакета с надеждой на его запуск на POS-сайте.

Когда апплет запускается из Eclipse, все идет хорошо.Когда апплет запускается из браузера, кажется, что мой пакет не может получить доступ к периферийным устройствам, подключенным через USB.Я получаю сообщение об ошибке из кода стороннего (JavaPOS) кода:

jpos.JposException: Не удалось открыть канал связи устройства, проверьте устройство и повторите попытку.

Апплет подписан с помощью самокерта.Я бы выложил некоторый код, но ошибка возникает из-за того, что он похоронен в драйверах, специфичных для производителя, для используемого принтера POS.

Я предполагаю, что проблема заключается в том, что из песочницы браузера апплет делаетнет доступа к периферийным устройствам, подключенным через USB.
Может ли это быть так?Если да, есть ли какой-либо доступ к периферийным устройствам USB из подписанного апплета?
Если апплет не может получить доступ к периферийным устройствам USB, как веб-сайт может вызывать код, который может?

Ответы [ 4 ]

2 голосов
/ 20 марта 2014

Имеют ли подписанные 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 () и логическими флагами, для запуска всех привилегированных функций.

2 голосов
/ 17 апреля 2011

Я не уверен в ответе на ваш вопрос, но проведу эксперимент, который должен пролить дополнительный свет на этот вопрос.

В первых строках звонка Applet.init() System.setSecurityManager(null). Затем попробуйте подключиться к USB.

  • Если апплет является доверенным, вызов setSecurityManager(null) будет успешным и удалит последние остатки SecurityManager. (Да, даже у доверенных апплетов есть менеджер безопасности, он гораздо менее строг, чем менеджер безопасности для приложений в песочнице.)
  • Если USB теперь обнаружен, это указывает на изменение в доверенном диспетчере безопасности. В последнее время произошел ряд таких изменений.

Обратите внимание, что Я не предлагаю запускать подобный код в производство. Если ваш апплет работает в том же JRE, что и другие апплеты, аннулирование SM также может повысить привилегии других апплетов.

1 голос
/ 28 сентября 2011

У меня была похожая проблема с Epson TM-H6000III на XP и Win7 32bit с использованием JRE 1.6.Администраторы могли использовать устройство, но «Пользователи» не могли.Консоль 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 быстро устранила проблему.

0 голосов
/ 14 мая 2011

Я получил отзыв от команды Star Micronics, что их ... драйверы javapos не поддерживают печать через веб-браузер.

Кстати, System.setSecurityManager (null) оказался отличным способом устранения неоднозначностилюбые проблемы, которые у меня были, казалось, были связаны с безопасностью.Спасибо Андрей.

...