Определить контекст апплета (я в апплете?) - PullRequest
1 голос
/ 18 марта 2010

Мне интересно, есть ли способ для класса Java выяснить, используется ли он в апплете?

То есть у меня есть библиотека (файл .jar), которая может использоваться сторонними приложениями и апплетами. Он работает в апплетах, но я хотел бы сделать некоторые вещи по-разному, в зависимости от того, используется ли библиотека в апплете - например, показать ошибки, применимые к апплету, избежать локального файлового ввода-вывода и т. Д.

Было бы неплохо, если бы, скажем, Applet.getAppletContext () был статическим, чтобы я мог вызвать его (и получить NULL или не NULL), даже если у меня нет экземпляра апплета, но, увы, это не так , Есть ли другой способ?

Ответы [ 3 ]

2 голосов
/ 18 марта 2010

Альтернативой для определения того, работает ли он как апплет или нет, является использование резервных методов в случае возникновения исключения безопасности. Это будет полезно при использовании в другой среде, например, в контейнере сервлета с контекстом безопасности.

Пример:

try {
    File file = new File("c:\\test.txt");
    System.out.println("Exists? " + file.exists());
} catch (java.security.AccessControlException e) {
    // fallback
}
1 голос
/ 18 марта 2010

Вероятно, самый безопасный способ - это сообщить пользователю, находится ли он в апплете (просто добавьте «логическую» переменную в соответствующий конструктор (ы) и / или метод (ы)).

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

В конце концов, самым безопасным способом будет заставить пользователей вашей библиотеки принять решение, поскольку они будут располагать необходимой информацией.

1 голос
/ 18 марта 2010

Согласно Техническому документу Java Security Overview (Страница 14, абзац 2)

Java-апплеты и Java ™ Web Start приложения запускаются автоматически с установленным SecurityManager. Тем не менее, локальные приложения выполняются через команду java по умолчанию не запускается с SecurityManager установлен.

Это должно означать, что вызов System.getSecurityManager () вернет ненулевое значение в апплете и вернет нулевое значение, когда его нет в апплете. Возможны исключения, например, менеджер безопасности может быть указан из командной строки при запуске программы.

boolean insideApplet()
{
  return null != System.getSecurityManager();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...