Java 实现Nashorn类滤波器等价
使用nashorn库Java 实现Nashorn类滤波器等价,java,java-8,nashorn,Java,Java 8,Nashorn,使用nashorn库jdk.nashorn.api.scripting.可以实现ClassFilter接口来禁用在Java中运行的javascript中实例化任何类: private static class NoJavaFilter implements ClassFilter { @Override public boolean exposeToScripts(String s) { return false; } } 当您这样起动发动机时,此功能
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());
但我使用的是内置的Java8javax.script
library:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
如果没有ClassFilter
,您有没有想过如何实现等效的功能
更新
此代码在Wildfly 14 EJB容器中运行。jsutilsbean被注入到调用程序中,调用程序运行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();
}
}
使用
jdk.nashorn.api.scripting
库,没有其他方法在您需要使用引擎时,似乎只有ScriptEngineManager
接口可用。我想接下来的问题是ScriptEngineManager
如何在应用程序中初始化?查看javadoc,您似乎可以注册alternativeScriptEngineFactory
对象。您可以使用“nashorn safe”这样的名称创建自己的ScriptEngineFactory
。如果NashornScriptEngineFactory
在初始化时可用,它甚至可以修饰它。ScriptEngineFactory
创建ScriptEngine
类,这些类用于运行脚本。相反,我要寻找的是一种创建ScriptEngineManager
类的方法,告诉它过滤Java类。通过查看javadocs,我无法理解这一点。此外,我找不到使用ScriptEngineFactory
和ScriptEngineManager
ScriptEngineManager
hasregisterEngineName()
和相关方法注册自己工厂的任何示例。SEM使用注册工厂构造与名称关联的特定ScriptEngine
。该注册已经发生在应用程序中的某个地方,可能是隐式的;sem.registerEngineName(“nashorn过滤器”,新的NashornScriptEngineFactory(){ScriptEngine getScriptEngine(){return super.getEngine(NoJavaFilter();}}});但是您可能对ScriptEngineManager
的创建时间有限制,或者必须在整个应用程序中共享一个;这就是为什么我询问不同的使用地点和时间。