首页 > 解决方案 > 实现 Nashorn ClassFilter 等价物

问题描述

使用 nashorn 库jdk.nashorn.api.scripting.*,可以实现该ClassFilter接口以禁用在 Java 中运行的 javascript 中实例化任何类:

private static class NoJavaFilter implements ClassFilter {

    @Override
    public boolean exposeToScripts(String s) {
        return false;
    }
}

当您像这样启动引擎时,这会起作用:

NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine nashorn = factory.getScriptEngine(new NoJavaFilter());

但我使用的是内置的 Java 8javax.script库:

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("nashorn");

那没有ClassFilter,任何想法如何实现等效?

更新

此代码在 Wildfly 14 EJB 容器中运行。JsUtils bean 被注入到调用程序中,该调用程序运行将run脚本作为参数发送的方法。

@Stateless
public class JsUtils {

    public String run(String script) throws ScriptException,
                                            NoSuchMethodException {     

        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("nashorn");                  
        Object result = engine.eval(script);
        return result.toString();
    }
}

标签: javajava-8nashorn

解决方案


使用jdk.nashorn.api.scripting图书馆,别无他法


推荐阅读