Разрешения Java-апплета
-
03-07-2019 - |
Вопрос
Я собрал базовый апплет, в котором пользователь выбирает файл со своего жесткого диска, он читает первую строку этого файла и передает его в JavaScript для какой-либо дополнительной предварительной обработки, а затем, когда вы нажимаете кнопку, он пытается загрузить этот файл через запрос HTTP POST. Я нашел очень простой апплет с открытым исходным кодом для загрузки файлов, которые я скопировал и изменил для этого последнего бита.
Проблема в том, что это не совсем работает. Кажется, что он работает нормально, но потом я сталкиваюсь с двумя препятствиями, связанными с разрешениями. В сообщениях в консоли Java говорится, что у апплета были ошибки доступа к следующим двум разрешениям:
java.lang.RuntimePermission setFactory
java.io.FilePermission read
Я нахожу это странным, потому что я думал, что уже предоставил разрешение апплету, когда создавал его с «самоподписанным». этот параметр отмечен в NetBeans, а затем нажат, чтобы подтвердить небольшое всплывающее окно безопасности в браузере.
Кроме того, та часть, которую я сам написал, где он читает файл и передает первую строку в JavaScript, работает нормально. Это довольно четкий показатель того, что апплет может читать из локальной файловой системы! Проблема не начнется, пока я не попытаюсь начать загрузку. Полагаю, стоит отметить, что процесс загрузки, похоже, выполняется в новом потоке, тогда как все остальное выполняется в основном классе без создания потоков.
Я новичок в Java и очень мало знаю о потоках в Java; мне нужно передать права доступа к этой новой теме как-то? Или что-то в этом роде? Заранее спасибо.
Решение
Возможно, вам нужно спросить у администратора безопасности (код, а не администратора) разрешение на выполнение привилегированной операции. По разным причинам для апплета обычно нехорошо иметь возможность открывать локальный файл, поэтому он защищен довольно сильно.
Основной ключ - вызвать AccessController.doPrivileged ()
, и есть хороший небольшой учебник об этом в FAQ по ранчо Java.
Другие советы
У меня была похожая проблема, решение которой заняло целую вечность. Оказывается, методы апплета, вызываемые из JavaScript, не имеют разрешений, даже если вы явно предоставляете их в файле политики.
Этот обходной путь работал для меня (добавление команд в очередь, через которую проходит апплет): http://blog.carrythezero.com/?p=5
Убедитесь, что вы понимаете опасность здесь: любой может изменить JavaScript на странице и изменить то, что подается в апплет. В моем случае я знаю, что код никогда не запускается на веб-сервере, и класс не подписан, поэтому он потерпит неудачу, если только в указанном месте, указанном в моем файле политики.
Это, вероятно, потому что JavaScript не подписан. Я настоятельно рекомендую не подписывать код, особенно если вы не знаете, что делаете. Начиная с версии 6u10 (пока не на Mac) апплеты могут использовать JNLP, включая FileOpenService, поэтому подписывать не нужно.