Java 仅允许某些类的System.exit

Java 仅允许某些类的System.exit,java,securitymanager,system.exit,Java,Securitymanager,System.exit,我们有一个支持插件的Java1.7应用程序,客户可以用Java编程。我们想限制插件调用System.exit。我们可以通过安全管理器来实现这一点。然而,在核心应用程序中,很少有需要调用System.exit的情况。有没有从SecurityManager中排除类或包的方法?我想您正在寻找以下方法: private static class ExitTrappedException extends SecurityException { } private static void forbid

我们有一个支持插件的Java1.7应用程序,客户可以用Java编程。我们想限制插件调用System.exit。我们可以通过安全管理器来实现这一点。然而,在核心应用程序中,很少有需要调用System.exit的情况。有没有从SecurityManager中排除类或包的方法?

我想您正在寻找以下方法:

private static class ExitTrappedException extends SecurityException 
{ 
} 
private static void forbidSystemExitCall()
{ 
    final SecurityManager securityManager = new SecurityManager() { 
         public void checkPermission( Permission permission ) 
        { 
              if( "exitVM".equals( permission.getName() ) ) 
            {  
                    throw new ExitTrappedException() ; 
            }
        }
    } ; 
    System.setSecurityManager( securityManager ) ; 
} 

private static void enableSystemExitCall() 
{  
       System.setSecurityManager( null ) ; 
}
这在调用插件的类中


将您的插件调用置于
禁止SystemExitCall
启用SystemExitCall
之间,我想您正在寻找以下内容:

private static class ExitTrappedException extends SecurityException 
{ 
} 
private static void forbidSystemExitCall()
{ 
    final SecurityManager securityManager = new SecurityManager() { 
         public void checkPermission( Permission permission ) 
        { 
              if( "exitVM".equals( permission.getName() ) ) 
            {  
                    throw new ExitTrappedException() ; 
            }
        }
    } ; 
    System.setSecurityManager( securityManager ) ; 
} 

private static void enableSystemExitCall() 
{  
       System.setSecurityManager( null ) ; 
}
这在调用插件的类中


将插件调用置于
禁止SystemExitCall
启用SystemExitCall

之间,类似于Batty的回答,只是您可以再次禁用设置安全管理器并覆盖checkExit()方法。我要做的是允许调用System.exit(),但这会触发插件停止/卸载,而不是退出整个JVM


您可以使用Thread.currentThread().getStackTrace()计算出调用System.exit()的代码

与Batty的答案类似,只是您可以再次禁用设置安全管理器并覆盖checkExit()方法。我要做的是允许调用System.exit(),但这会触发插件停止/卸载,而不是退出整个JVM


您可以使用Thread.currentThread().getStackTrace()计算出调用System.exit()的代码

这并没有真正的帮助,因为恶意插件仍然可能在调用System.exit()之前禁用或替换安全管理器。@jarnbjo我们将进一步修改自定义安全管理器以检查“setSecurityManager”权限,这是根据@Benjamin:确定您可以让安全管理器否认它被替换为新的管理器或被禁用,但这种方法仍然不起作用。Peter的建议(使用堆栈跟踪检查方法的起源)可能要好得多。@jarnbjo我同意堆栈跟踪检查。除了在我们的代码中将其设置为null可能有困难之外,您是否看到检查“setSecurityManager”权限不起作用的任何其他原因?在代码中将其设置为null可能不会有问题,这根本不可能。如果您允许禁用或以其他方式修改安全管理器而不检查谁在进行修改,则无法确保修改不是来自恶意插件。这并没有真正的帮助,因为恶意插件仍可能在调用System.exit()之前禁用或替换安全管理器@jarnbjo我们将进一步修改我们的自定义SecurityManager,以检查“setSecurityManager”权限,该权限是根据@Benjamin:确定您可以让安全管理器否认它被新的管理器替换或禁用的,但这种方法仍然不起作用。Peter的建议(使用堆栈跟踪检查方法的起源)可能要好得多。@jarnbjo我同意堆栈跟踪检查。除了在我们的代码中将其设置为null可能有困难之外,您是否看到检查“setSecurityManager”权限不起作用的任何其他原因?在代码中将其设置为null可能不会有问题,这根本不可能。如果允许禁用或修改安全管理器而不检查修改者,则无法确保修改不是来自恶意插件。当然,基于可配置条件授予权限是
SecurityManager
的主要目的。也许您想阅读……当然,基于可配置条件授予权限是
SecurityManager
的主要目的。也许您想阅读……还有一个受保护的类[]SecurityManager.getClassContext(),它可能更容易使用。还有一个受保护的类[]SecurityManager.getClassContext(),它可能更容易使用。