我已經創建了一個簡單的插件系統,允許其他人上傳他們的插件的jar,插件系統將加載它並在其中執行一些代碼。如何禁止一個jar在java中創建新線程
插件系統將獲得Function<Input, Output>
的子類來執行加載的插件邏輯,但我不希望該函數創建新線程或執行一些危險操作,如System.exit
。我怎麼能禁止這個動作?
我在Java中找到了AccessController
或SecurityManager
,如何使用它來實現我的意圖。
我已經創建了一個簡單的插件系統,允許其他人上傳他們的插件的jar,插件系統將加載它並在其中執行一些代碼。如何禁止一個jar在java中創建新線程
插件系統將獲得Function<Input, Output>
的子類來執行加載的插件邏輯,但我不希望該函數創建新線程或執行一些危險操作,如System.exit
。我怎麼能禁止這個動作?
我在Java中找到了AccessController
或SecurityManager
,如何使用它來實現我的意圖。
就像你說的,你可以添加一個安全管理器。像下面這樣:你可以把你的代碼放在try catch塊中並捕獲你的自定義安全異常。下面的代碼運行在循環中並繼續調用System.exit(1);
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);
}
}
鏈接的答案描述瞭如何使用SecurityManager來防止線程啓動,所以我不確定如何得出結論,這是不可能的。從答案中可以得出結論:「解決這個問題的一個方法是繼承java.lang.SecurityManager並覆蓋getThreadGroup方法以返回根ThreadGroup。這將允許您控制代碼是否可以根據它是否具有java創建線程。 lang.RuntimePermission「modifyThreadGroup」。「 –
感謝您對我更新我的答案的快速反饋;-) – GhostCat
@GhostCat FGITW嗯? – Gab