Я смотрю на подписанный апплет, который сильно вызван из JavaScript. Очевидно, что потоки, созданные из JavaScript, более изолированы, чем любой поток, запущенный непосредственно из Java. Например, если поток JavaScript вызывает в Applet и регистрирует что-то, что заставляет файл журнала катиться, генерируется исключение безопасности. Любой поток, запущенный непосредственно внутри апплета, не будет испытывать это исключение безопасности. Решение здесь с log4j заключается в использовании асинхронного приложения.
Но с другими исключениями безопасности (например, с использованием Apache Axis в подписанном апплете, но в потоке JavaScript) нет очевидного способа иметь некоторый асинхронный поток. Скажем, у меня есть следующий код, который, если вызывается из потока Java, будет работать, и если вызов через JavaScript завершится с безопасностьюException:
public void someMethodCalledFromJavaScript() {
// Stuff that would throw a SecurityException
}
Я вижу три следующих параметра, но они могут быть недействительными. Ради этого обсуждения проигнорируйте, будет ли выполнение синхронным или асинхронным, так как это легко управляется. Мне сложно понять детали модели безопасности. Вот мои три возможных варианта:
-
Начать новую тему (будет ли это работать даже?):
public void someMethodCalledFromJavaScript() { new Thread(new Runnable() { public void run() { // Stuff that would throw a SecurityException } }).start(); }
-
У Applet есть поток, готовый идти все время, запускаемый через поток исходного кода JavaScript (здесь очень упрощенный код):
private volatile boolean doit = false; // This code is running in a Thread, started @ Applet init time public void alwaysWaiting() { while (true) { if (doit) { doit = false; // Stuff that would throw a SecurityException } } } public void someMethodCalledFromJavaScript() { doit = true; }
-
Использовать AccessController.doPrivileged:
public void someMethodCalledFromJavaScript() { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // Stuff that would throw a SecurityException return null; } }); }
В соответствии с тем, что я читал в AccessController.doPrivileged
, вы запускаете с пересечением существующих привилегий безопасности и привилегий домена безопасности кода, который вы вызываете. Для меня это не имеет смысла, как если бы вы работали с пересечением низкого и высокого домена безопасности, у вас будет только домен с низкой степенью защиты. Так что я не понимаю что-то.
Конкретный SecurityException
, который я вижу, следующий:
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)
но, конечно, мне любопытно об общем случае в контексте вызова JavaScript в подписанный апплет и как я могу разрешить поток, созданный JavaScript, для работы с приложением подписанного апплета, как если бы это был поток которая возникла исключительно внутри апплета.
Какие варианты выше будут работать, и которые лучше других, и почему.