политика безопасности апплета в Mac OS [править: не политика в конце концов] - PullRequest
0 голосов
/ 08 ноября 2011

Это будет большой беспорядок, чтобы объяснить, но если у кого-то есть указатель, пожалуйста, поделитесь!

Из апплета, который я вызываю, библиотеку третьей четности, которая использует JNI, получает некоторую информацию в ОСконкретным образом.Я не знаю, что он вызывает, так как у меня нет кода и поддержка не очень отзывчива.Дело в том, что все хорошо работает в Windows (не только на моей машине), но и в Mac OS. Один из методов lib генерирует исключение, специфичное для lib (код и сообщение «Cannot complete» ~).Кажется, это проблема, связанная с безопасностью, поскольку метод работает, когда я вызываю его из init ().

JAR-файл с моим апплетом самоподписан, в библиотеке есть еще 4 JAR-файлов, подписанных поставщиком.,Метод lib вызывается из блока «AccessController.doPrivileged» как метод апплета, который вызывается из JavaScript - и все это работает, но только для окон.

В Mac это вызов из JavaScript в метод апплетакоторый вызывает метод библиотеки lib, получает исключение.

Вот что я попробовал:

Я переместил вызов метода библиотеки lib в init () только для теста, и он работает нормально, только без блока «AccessController.doPrivileged».Я попытался запустить поток в init () (а также в start ()): - используя таймер, чтобы поток вызывал метод lib каждые 10 секунд, он работает нормально, и я могу получить обновленный ответ через буфер строк - это не такпредпочтительное решение.- но если я использую флаг в потоке, чтобы метод апплета мог вернуть результат, он выдает то же исключение.

Вот код в методе моего апплета:

checkRunner.refreshWindowsList = true;
while (checkRunner.refreshWindowsList) {
    try {           
        Thread.sleep(300);
    } catch (Exception ex) {
        System.out.println("Ignoring exception: " + ex.getMessage());
    }
}
return checkRunner.windowsTitles;

ив методе выполнения Thread:

try {
    while (true) {
        if (refreshWindowsList) {
            windowsTitles = getWindowsTitlesPrivileged();
            //windowsTitles = getWindowsTitles();
            refreshWindowsList = false;
        }
        Thread.sleep(300);
    }
} catch (Exception ex) {
    System.out.println("Ignoring exception: " + ex.getMessage());
}

Я не понимаю, как простая передача флага может привести к различным результатам.

Кроме того, кажется, что когда апплет создан из кода JavaScriptвсе это помещается в «песочницу», а метод lib выдает исключение даже из init () ... опять же только в Mac OS.

Если кто-то сделал это так далеко - Спасибо:)

1 Ответ

0 голосов
/ 16 ноября 2011

Чтобы ответить на мой вопрос, даже подумал, что я сильно сомневаюсь, что это общая проблема ...

Оказывается, что проблема не связана с безопасностью в конце концов. Проблема возникает из-за совершенно необъяснимого (для меня) поведения библиотеки 3-й четности - всякий раз, когда проблемный метод вызывается, даже в отдельном потоке, а в основном потоке это цикл ожидания ответа - исключение выброшены.

Таким образом, следующий код завершается ошибкой, но когда удаляется строка ожидания в конце, он работает нормально. Это происходит независимо от того, где находится код, init () или метод, вызываемый из JavaScript - поведение одинаково.

new Thread(new Runnable() {
    public void run() {
        AccessController.doPrivileged(new PrivilegedAction<String>() {
            public String run() {
                callTheMehod();
            }
        });
    }
}).start();

try { Thread.sleep(5000); } catch (exce....) {}

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

Таким образом, кажется, что когда в главном потоке слишком много нагрузки, возникает исключение. Это совершенно необъяснимо для меня, но поскольку библиотека использует JNI, я думаю, что многое может пойти не так.

...