Используя библиотеку nashorn jdk.nashorn.api.scripting.*
, можно реализовать интерфейс ClassFilter
, чтобы отключить создание экземпляров любого класса из javascript, запускаемого в Java:
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 8 javax.script
:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
У которой нет ClassFilter
, есть мысли, как реализовать эквивалент?
ОБНОВЛЕНИЕ
Этот код выполняется в контейнере Wildfly 14 EJB.Бин JsUtils внедряется в invoker, который запускает метод 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();
}
}