Вопрос

Я собрал базовый апплет, в котором пользователь выбирает файл со своего жесткого диска, он читает первую строку этого файла и передает его в 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, поэтому подписывать не нужно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top