2012-05-30 39 views
3

如何在Java中的Rhino中運行JavaScript執行本地文件?我會考慮在Rhino環境中使用的任何方法。我目前對這個問題的探討如下。從Rhino腳本中訪問Java特權操作

我試圖通過java.lang.Runtime.exec,從Mozilla的「腳本Java」教程,我可以訪問它的幫助。但是,這是一個受限制的操作,因此直接調用它會導致訪問控制異常。

爲了解決這個問題,我需要使用AccesController.doPrivileged方法。下面是一個在Java中使用它的例子;

AccessController.doPrivileged(new PrivilegedAction() { 
      public Object run() { 
      // Code goes here. Any permission checks within this 
      // run method will require that the intersection of the 
      // callers protection domain and the snapshot's 
      // context have the desired permission. 
      } 

該路障正在複製javascript中的PrivilegedAction的構造。

var ourRuntime = Packages.java.lang.Runtime.getRuntime(); 
//ourRuntime.exec("notepad.exe") //will raise Access Control Exception 
var controller = Packages.java.security.AccessController.doPrivileged 
var action = new Packages.java.security.PrivilegedAction(ourRuntime.exec("notepad.exe"))   // somehow make this wwrk 
controller.doPrivileged(action) 

Mozilla Scripting Java

java.securit.AccessController

回答

0

犀牛是由Java 6的腳本API支持,所以你可以用與doPrivileged的腳本的評估和必要的權限執行整個腳本。 Java腳本API與doPrivileged結合的例子是here

+0

這種方法應該工作,但我很謹慎執行整個腳本使用權限進行的,似乎是不好的做法。 – OutRideACrisis

+1

@OutRideACrisis,每個腳本當然可以擁有不同的權限。實現OP目標的另一種方法可能是使用URLReader並傳入帶有自定義方案的URL(例如「scripts://」)。然後,您可以控制代碼之外的每個腳本的訪問權限。沒有測試過這個,但我認爲它會起作用。 –

0

我已經成功地開始了KWrite(例如)這種方式。我基本上將Runtime對象暴露給嵌入式JavaScript解釋器。

public class RunBasicScript { 

public static void main(String[] args) { 

    // Get a handle to the JavaScript context 
    Context cx = Context.enter(); 

    try 
    { 
     // Set up the standard JavaScript objects 
     // like Object, Function etc. 
     Scriptable scope = cx.initStandardObjects(); 

     // Make Runtime.getRuntime available to our JavaScript code 
     Object exec = Context.javaToJS(Runtime.getRuntime(), scope); 
     ScriptableObject.putProperty(scope, "exec", exec); 

     // Build our awesome script 
     String script = "exec.exec('kwrite');"; 

     // Now we execute the script 
     Object obj = cx.evaluateString(scope, script, "Testing", 1, null); 
    } 
    catch (Exception e) 
    { 
     System.err.println("Error : " + e); 
    } 
    finally 
    { 
     // We need to exit the Context. 
     Context.exit(); 
    } 
} 

}