JFileChooser вызывает AccessControlException при вызове через JS, работает при вызове через апплет - PullRequest
3 голосов
/ 29 февраля 2012

Я работаю над вспомогательным апплетом для управления передачей больших файлов. В настоящее время у нас есть апплет, который управляет полной транзакцией: от выбора папки, содержащей файлы, их передачи и отчетов об успехе и неудаче операции, но он очень неудовлетворителен по ряду причин. Так что теперь мы просто хотим очень тонкой помощи от апплетов, чтобы пользователь мог найти папку на своей локальной машине и управлять передачей. Мы хотели бы как можно больше обратной связи и взаимодействия с пользователем, чтобы использовать веб-элементы управления. Как вы можете себе представить, это требует довольно широкого использования моста между апплетами и Javascript в браузере.

По большей части это довольно просто, но я обнаружил странный крайний случай. У меня есть метод, который открывает диалоговое окно JFileChooser и просматривает содержимое этой папки и сообщает об этом. У меня это работает, когда я создаю JButton в методе start () и использую его для вызова JFileChooser. Но я поместил весь код JFileChooser в метод с именем showFolderSelect (), чтобы я мог также попытаться открыть JFileChooser из Javascript. Так что этот вызов из апплета работает:

public void actionPerformed(ActionEvent event) {
    if ("browse".equals(event.getActionCommand())) {
        showFolderSelect();
    }
}

Но этот вызов из Javascript не:

function selectFolder() {
    var infoApplet = document.getElementById('infoApplet');
    infoApplet.showFolderSelect();
}

При вызове Javascript в консоли Opera появляется следующее сообщение:

[5 October, 2003 6:26:56 AM] JavaScript - http://localhost:8080/applet-webapp/
Event thread: click
Uncaught exception: Error: java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
Error thrown at line 20, column 12 in selectFolder() in http://localhost:8080/applet-webapp/:
   infoApplet.showFolderSelect();
called from line 1, column 0 in <anonymous function>(event) in http://localhost:8080/applet-webapp/:
   selectFolder();

Любые идеи о том, как я могу заставить это работать из Javascript? Или мне просто нужно использовать JButton, созданный в методе start () апплета?

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

Спасибо за любую помощь или понимание по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

В большинстве современных веб-браузеров приложения JS могут открывать диалоговые окна файлов только в ответ на действия пользователя. Таким образом, вы можете создать диалог открытия файла из обработчика onclick (включая, по-видимому, обработчик в апплете Java), но не из, например, обработчик загрузки.

Таким образом, вам может потребоваться создать кнопку или <a href="#"/>, чтобы пользователь мог щелкнуть по ней, а затем вызвать showFolderSelect(), находясь внутри этого обработчика событий.

0 голосов
/ 02 марта 2012

Я думаю, это иллюстрирует, что может делать Java, а что нет JavaScript.Похоже, JavaScript не может вызывать методы, которые разрешают доступ к клиентской системе.Возможно, доступ JavaScript к коду Java ограничен тем, что было бы разрешено неподписанным апплетом.

Я не могу себе представить способ обойти это, если это всего лишь ограничение в мосте Java - JavaScript.И для меня это выглядит так.

Если вас не устраивает общее взаимодействие с пользователем в апплете, рассмотрите возможность его перемещения в JavaFX вместо простого интерфейса браузера с JavaScript.

Проверьте Галерея Java FX Ensemble для получения списка компонентов пользовательского интерфейса, которые вы можете использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...