3

如何从在 Java 中的 Rhino 中运行的 JavaScript 执行本地文件?我会考虑在 Rhino 环境中工作的任何方法。我目前对该问题的探索如下。

我正在通过 java.lang.Runtime.exec 尝试这个,在 Mozilla“Scripting 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 脚本 Java

java.securit.AccessController

4

2 回答 2

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();
    }
}

}

于 2012-05-30T10:29:16.263 回答
0

Java 6 脚本API支持 Rhino ,因此您可以使用 doPrivileged 包装脚本的 eval 并以必要的权限执行整个脚本。结合 doPrivileged 的​​ java 脚本 API 示例在这里

于 2012-05-30T10:24:30.097 回答