Как очистить SSJS в Domino server после того, как кто-то использовал прототип javascript в nsf?

Как очистить SSJS (серверный Javascript) на сервере Domino после того, как кто-то использовал прототип javascript в nsf?

Марк Роден обнаружено огромная слабость в XPages SSJS: (спасибо Дэвиду Лиди за то, что рассказал мне об этом и показал мне статью).

если у вас есть следующий код SSJS:

var dummyObj = {}
dummyObj.prototype.NAME = "Johann"

XPages SSJS не волнует, что вы используете var (var означает, что переменная должна быть локальной), и это делает dummyObj.Имя видимый во всем сервере со значением Иоганн. Поэтому, если другой nsf на том же сервере использует var с тем же именем, он наследует весь прототип:

var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */ 

это огромная ошибка (та, которая делает ненадежными XPages SSJS IMO). Даже если вы не используете прототип вообще, если кто-то еще в своем приложении делает что-то вроде этого:

String.prototype.split = function(){ return "I broke this method" }

он сломал все приложения на том же сервере, который использует невинный split ().

Итак, вопрос: если кто-то" по ошибке " пишет следующие SSJS (Xpages Server Side Javascript) в NSF:

String.prototype.split = function(){ return "I broke this method" }

как я могу исправить строку.прототип.сплит() к его первоначальной стоимости?

как сказал Марк Роден, перезапуск HTTP-задачи не исправляет его.

///////////////////////////////////////////////////////////

Edit 1: Почему я думаю, что это огромная ошибка:

Я поклонник Javascript, но IMHO @MarkyRoden обнаружил огромную ошибку в SSJS. Прокладки и polyfills на самом деле не главная проблема. Eval, как известно, плохая практика, но объект-прототип является фундаментальным элементом базового Javascript. Это стандартный и предпочтительный способ добавления методов в классы Javascript, он также необходим для наследования и всех видов ООП вещи. Поэтому вам понадобится какое-то пространство имен на уровне сервера, чтобы избежать конфликтов. Все это очень плохо, но огромная проблема что просто строка кода в одном приложении может сломать все приложения на сервере. Да, вы можете доверять своим разработчикам, но один из них может написать плохую строку по ошибке, а также сервер Domino может иметь сотни приложений от разных поставщиков программного обеспечения. Установка ответственности в обзорах кода не является надежной процедурой enought. Возможно, пришло время иметь настоящий движок javascript в SSJS, например V8, Spidermonkey, Chakra или Rhino. В качестве обходного пути я думаю о чем-то вроде Томми Валанда идея с носорогом в SSJS.

Edit 2: это еще хуже. Вы можете делать такие вещи, как:

prototype.importPackage = null

или

prototype.Array = null

как вы можете видеть в статье @SvenHasselbach:http://hasselba.ch/blog/?p=1371

Edit 3: IBM: вы сказали мне, что я могу использовать SSJS. ПРИХОДИ ОДИН! Пожалуйста, исправь это, это ужасно. Пожалуйста, давайте официально сообщим об этом IBM.

2 ответов


вы можете сбросить интерпретатор SSJS со следующим кодом Java:

FacesContextExImpl fc = (FacesContextExImpl) FacesContextExImpl.getCurrentInstance();
UIViewRootEx2 uiRoot = (UIViewRootEx2) fc.getViewRoot();
JSContext jsContext = uiRoot.getJSInterpreter().getJSContext();
jsContext.getRegistry().init(jsContext);

это обновляет реестр и все функции прототипа.

EDIT: изменена декларация fc к правильному типу.

EDIT 2: Вот версия SSJS:

var uiRoot = facesContext.getViewRoot();
var jsContext = uiRoot.getJSInterpreter().getJSContext();
var reg = jsContext.getRegistry();
reg.init( jsContext );

правильно ли я вас понимаю, что вы хотите очистить интерпретатор SSJS, чтобы избежать столкновения с вашим собственным прототип


попробуйте вместо этого выполнить задачу перезапуска Http скажите http restart не будет делать полный перезапуск задачи http