Разрешения Java-апплета - PullRequest
5 голосов
/ 06 марта 2009

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

Но проблема в том, что это не совсем работает. Кажется, что он работает нормально, но потом я сталкиваюсь с двумя препятствиями, связанными с разрешениями. В сообщениях в консоли Java говорится, что апплет имел ошибки запрещенного доступа для следующих двух разрешений:

java.lang.RuntimePermission setFactory
java.io.FilePermission read

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

Кроме того, часть, которую я сам кодировал, где он читает файл и передает первую строку в JavaScript, работает нормально. Это довольно четкий показатель того, что апплет может читать из локальной файловой системы! Проблема не начнется, пока я не попытаюсь начать загрузку. Полагаю, стоит отметить, что процесс загрузки, похоже, выполняется в новом потоке, тогда как все остальное выполняется в основном классе без создания потоков.

Я новичок в Java и очень мало знаю о потоках в Java; мне нужно передать права доступа к этой новой теме как-то? Или что-то в этом роде? Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 06 марта 2009

Возможно, вам нужно спросить у администратора безопасности (код, а не администратора) разрешение на выполнение привилегированной операции. По разным причинам для апплета обычно нехорошо иметь возможность открывать локальный файл, поэтому он защищен довольно сильно.

Основной ключ - вызвать AccessController.doPrivileged(), и в FAQ по ранчо Java есть хороший маленький учебник .

1 голос
/ 14 января 2011

У меня была похожая проблема, решение которой заняло целую вечность. Оказывается, методы апплета, вызываемые из JavaScript, не имеют разрешений, даже если вы явно предоставляете их в файле политики.

Этот обходной путь работал для меня (добавление команд в очередь, через которую проходит апплет): http://blog.carrythezero.com/?p=5

Убедитесь, что вы понимаете опасность здесь: любой может изменить JavaScript на странице и изменить то, что подается в апплет. В моем случае я знаю, что код никогда не отправляется на веб-сервер, и класс не подписан, поэтому он потерпит неудачу, если только в указанном месте, указанном в моем файле политики.

0 голосов
/ 06 марта 2009

Это, вероятно, потому что JavaScript не подписан. Я настоятельно рекомендую не подписывать код, особенно если вы не знаете, что делаете. Начиная с версии 6u10 (пока не на Mac) апплеты могут использовать JNLP, включая FileOpenService, поэтому подписывать не нужно.

...