禁止调用System.exit

时间:2011-11-25 14:14:14

标签: java securitymanager

我试图禁止在某些罐子里调用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 个答案:

答案 0 :(得分:3)

根据错误报告http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238,策略文件不允许System.exit()调用。我正在使用Java 1.6运行一个应用程序,尽管它已经“解决”,但仍然看到了这个bug。与OP类似,我有一个系统范围的策略文件,其中不包含exitVM的权限。但是,我可以在不抛出任何异常的情况下退出应用程序。

我对包含自定义策略文件的理解是,除了策略文件中包含的权限外,所有权限都被列入黑名单。由于不包含exitVM,因此应禁止它(覆盖MicSim提到的默认权限)。但这种情况并非如此。

答案 1 :(得分:2)

来自RuntimePermission的Javadoc:

  

注意:“exitVM。*”权限自动授予从应用程序类路径加载的所有代码,从而使应用程序能够自行终止。

阅读此内容,您似乎必须通过编写自己的SecurityManager来明确拒绝此权限。 (例如,请参阅此答案:Prevent System.exit to actually exit the JVM

答案 2 :(得分:1)

或者你可以做AOP并拦截System.exit。自己做的就是:创建自己的类加载器并使用BPEL跟踪System.exit,并修补这些调用。真的不是很大的努力。