2009-03-06 6 views
5

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

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

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

я нахожу это странным, потому что я думал, что получил разрешение на апплет уже тогда, когда я построил его с " self-signed "в NetBeans, а затем нажмите, чтобы подтвердить небольшое всплывающее окно безопасности в браузере.

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

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

ответ

3

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

Базовый ключ - позвонить AccessController.doPrivileged(), а на вопрос о ранчо Java Ranch есть good little tutorial.

+0

do Privileged чрезвычайно опасен. Как подписывает апплеты. –

+3

Как позволяет апплеты читать файлы. Тем не менее, он есть и ответ на вопрос. –

0

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

+0

не JavaScript; Ява. – Ricket

+0

Вопрос в том, что есть JavaScript. Моя образованная догадка заключается в том, что ее JavaScript в контексте управления доступом вызывает эту проблему. –

1

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

Это решение работает для меня (добавление команд в очереди, которые апплет перебирает): http://blog.carrythezero.com/?p=5

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