запретить звонок в System.exit - PullRequest
       13

запретить звонок в System.exit

11 голосов
/ 25 ноября 2011

Я пытаюсь запретить вызов System.exit(int); в некоторых банках.

Эти банки будут разработаны внешними командами и загружены нашим приложением-контейнером.

Мой первыйРефлекс должен использовать менеджер безопасности Java:

-Djava.security.manager-Djava.security.debug=all

с самым простым ${user.home}/.java.policy файлом:

grant {};

Хотя я больше не могу вызывать такие, как System.getProperties () (так какУ меня нет java.util.PropertyPermission), я могу сделать System.exit (0) !!

Опция java.security.debug=all дает следующую консоль:

scl: getPerms ProtectionDomain (file: my-bin-path <no sign certificates>)
sun.misc.Launcher $ AppClassLoader @ 10385c1
<no principals>
java.security.Permissions @ 15b7986 (
(java.lang.RuntimePermission exitVM)
(java.io.FilePermission \my-bin-path\- read)
)

Почемувсе классы в my-bin-path имеют java.lang.RuntimePermission exitVM предоставлено ?????

спасибо

Ответы [ 3 ]

3 голосов
/ 11 января 2013

Согласно отчету об ошибке, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238, файл политики не запрещал вызовы System.exit (). Я запускаю приложение с Java 1.6 и все еще вижу эту ошибку, несмотря на то, что она "устранена". Подобно OP, у меня есть системный файл политики, который не включает разрешение для exitVM. Тем не менее, я могу выйти из приложения без каких-либо исключений.

Насколько я понимаю, включение пользовательского файла политики заключается в том, что все разрешения находятся в черном списке, кроме тех, которые включены в файл политики. Поскольку exitVM не включен, его следует запретить (переопределяя разрешение по умолчанию, упомянутое MicSim). Но это не так.

2 голосов
/ 25 ноября 2011

Из Javadoc RuntimePermission :

Примечание. Разрешение «exitVM. *» Автоматически предоставляется всему коду, загруженному из пути к классам приложений, что позволяет приложениям завершать свою работу.

Читая это, вы, очевидно, должны явно отказать в этом разрешении, написав свой собственный SecurityManager. (Например, см. Этот ответ: Запрет System.exit для фактического выхода из JVM )

1 голос
/ 25 ноября 2011

В качестве альтернативы вы можете сделать AOP и перехватить System.exit. Сделайте это сами: создайте свой собственный загрузчик классов и используйте BPEL для трассировки System.exit и исправления этих вызовов. На самом деле не большое усилие.

...