2017-01-20 12 views
0

Есть ли способ, чтобы удалить доступ к глобал в Nashorn короткий изУдалить Globals из Nashorn

$ENV=undefined 

?

Я проделал некоторые поиски, но я не вижу ничего, кроме как использовать глобальные переменные.

Также есть список аргументов/флагов, которые я могу передать в движок скрипта? В настоящее время я делаю --no-java, но я не могу найти исчерпывающий список в любом месте.

Любая помощь приветствуется.

ответ

1

Вы можете получить список параметров командной строки через jjs -help.

Я точно не знаю об удалении глобалов, но я сомневаюсь. Nashorn использует класс Global, который представляет объект ECMAScript global, как описано here.

ENGINE_SCOPE по умолчанию представляет собой обернутый экземпляр «глобального» объекта ECMAScript, который является «этим» в выражениях сценариев верхнего уровня. Таким образом, вы можете получить доступ к объектам верхнего уровня ECMAScript, таким как «Object», «Math», «RegExp», «undefined» из этого объекта области. Объект глобальной области Nashorn представлен внутренним классом реализации, называемым jdk.nashorn.internal.objects.Global.

Это Global класс имеет кучу базовой ECMAScript водопровода запеченной в него в неизменном образом, как и без него Javascript просто не будет работать без каких-либо (Object или Function прототипов, например). Эта страница заявляет, что попытки использовать альтернативный объект в качестве глобального приведет к тому, что движок помещает ваш пользовательский «глобальный» объект в новый экземпляр Global. Пытаться запустить Javascript без этого global сантехника просто не сработает.

Теперь, если вы хотите ограничить классы Java доступными для скрипта, это относительно просто (хотя и не так просто, как хотелось бы).

ClassFilter filter = new ClassFilter() { 
    @Override 
    public boolean exposeToScripts(String name) { 
     // This would disable all Java classes 
     return false; 
    } 
}; 
ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(filter); 

Основным недостатком здесь является то, что ClassFilter и getScriptEngine(ClassFilter) методы не являются частью javax.scripting API, и вы должны получить доступ к Nashorn-специфические классы в jdk.nashorn.api.scripting пакете непосредственно.