2017-10-10 157 views
0

我已經創建了一個簡單的插件系統,允許其他人上傳他們的插件的jar,插件系統將加載它並在其中執行一些代碼。如何禁止一個jar在java中創建新線程

插件系統將獲得Function<Input, Output>的子類來執行加載的插件邏輯,但我不希望該函數創建新線程或執行一些危險操作,如System.exit。我怎麼能禁止這個動作?

我在Java中找到了AccessControllerSecurityManager,如何使用它來實現我的意圖。

回答

4

就像你說的,你可以添加一個安全管理器。像下面這樣:你可以把你的代碼放在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); 
    } 

} 
1

對於System.exit() - 請參閱其他答案。

爲防止啓動線程:可能,但需要擴展SecurityManager類 - 請參閱here

AccessController更多關於如何客戶端將編寫可能檢查的代碼。這不是您作爲JVM的「所有者」可以使用的東西(請參閱here)。所以這對你的問題沒有幫助。

+1

鏈接的答案描述瞭如何使用SecurityManager來防止線程啓動,所以我不確定如何得出結論,這是不可能的。從答案中可以得出結論:「解決這個問題的一個方法是繼承java.lang.SecurityManager並覆蓋getThreadGroup方法以返回根ThreadGroup。這將允許您控制代碼是否可以根據它是否具有java創建線程。 lang.RuntimePermission「modifyThreadGroup」。「 –

+0

感謝您對我更新我的答案的快速反饋;-) – GhostCat

+0

@GhostCat FGITW嗯? – Gab

相關問題