Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何禁止jar在java中创建新线程_Java_Multithreading_Security_Access Control - Fatal编程技术网

如何禁止jar在java中创建新线程

如何禁止jar在java中创建新线程,java,multithreading,security,access-control,Java,Multithreading,Security,Access Control,我创建了一个简单的插件系统,允许其他人上传他们插件的jar,插件系统将加载它并在其中执行一些代码 插件系统将获得一个子类Function来执行加载的插件逻辑,但我不希望该函数创建新线程或执行一些危险操作,如system.exit。我怎样才能禁止这种行为 我在Java中找到了AccessController或SecurityManager,以及如何使用它来实现我的意图。正如您所说,您可以添加一个安全管理器。如下所示:您可以将代码放入try-catch块中,并捕获抛出的自定义安全异常。下面的代码在循

我创建了一个简单的插件系统,允许其他人上传他们插件的jar,插件系统将加载它并在其中执行一些代码

插件系统将获得一个子类
Function
来执行加载的插件逻辑,但我不希望该函数创建新线程或执行一些危险操作,如
system.exit
。我怎样才能禁止这种行为


我在Java中找到了
AccessController
SecurityManager
,以及如何使用它来实现我的意图。

正如您所说,您可以添加一个安全管理器。如下所示:您可以将代码放入try-catch块中,并捕获抛出的自定义安全异常。下面的代码在循环中运行并继续调用系统。退出(1)


正如您所说,您可以添加一个安全管理器。如下所示:您可以将代码放入try-catch块中,并捕获抛出的自定义安全异常。下面的代码在循环中运行并继续调用系统。退出(1)

有关
System.exit()
,请参阅其他答案

用于防止线程启动:可能,但需要扩展SecurityManager类-请参阅

AccessController
更多的是关于客户端如何编写可能被检查的代码。作为JVM的“所有者”,您不能使用它(请参阅)。因此,它对您的问题没有帮助。

有关
System.exit()
-请参阅其他答案

用于防止线程启动:可能,但需要扩展SecurityManager类-请参阅


AccessController
更多的是关于客户端如何编写可能被检查的代码。作为JVM的“所有者”,您不能使用它(请参阅)。因此,它对您的问题没有帮助。

您链接的答案描述了如何使用SecurityManager来防止线程启动,因此我不确定您如何得出这样的结论:这是不可能的。答案是:“解决这个问题的一种方法是将java.lang.SecurityManager子类化,并重写getThreadGroup方法以返回根线程组。这将允许您根据代码是否具有java.lang.RuntimePermission“modifyThreadGroup”来控制代码是否可以创建线程。”感谢您对我更新答案的快速反馈;-)@GhostCat FGITW hmmm?当然不是,另一个人比我快得多(至少30秒)。也可以通过
AccessController
/
AccessControlContext
的方式,通过一个
ClassLoader
将它加载的类映射到
ProtectionDomain
没有
运行时权限的类“exitVM.*”
(它们在默认加载程序下执行此操作)。您链接的答案描述了如何使用SecurityManager阻止线程启动,因此我不确定您如何得出不可能的结论。从答案:解决这个问题的一种方法是将java.lang.SecurityManager子类化,并重写getThreadGroup方法以返回根ThreadGroup。这将允许您根据代码是否具有java.lang.RuntimePermission“modifyThreadGroup”来控制代码是否可以创建线程。“感谢您在我更新答案时提供的快速反馈;-)@GhostCat FGITW hmmm?当然不是,另一个人比我快得多(至少30秒)。也可以通过
AccessController
/
AccessControlContext
的方式,通过
ClassLoader
将加载的类映射到
ProtectionDomain
中没有
RuntimePermission
“exitVM.*(它们在默认加载程序下会这样做)的
import java.security.Permission;

public class TestPreventSystemExit {

    public static void main(String[] args) {
        forbidSystemExitCall();
        while (true) {
            try {
                System.exit(1);
            } catch (Exception ex) {

            }
        }
    }

    private static class PreventExitException extends SecurityException {
    }

    private static void forbidSystemExitCall() {
        final SecurityManager securityManager = new SecurityManager() {
            public void checkPermission(Permission permission) {
                if (permission.getName().indexOf("exitVM") >= 0) {
                    System.out.println("Why you did this to me? :)");
                    throw new PreventExitException();
                }
            }
        };
        System.setSecurityManager(securityManager);
    }

}