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

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

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

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

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

XPages SSJS не заботится о том, чтобы вы использовали var (var означает, что переменная должна быть локальной) и она отображает dummyObj.NAME на весь сервер со значением Johann. Поэтому, если другой 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" }

Как я могу исправить String.prototype.split() до его первоначального значения?

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

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

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

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

Изменить 2: Это еще хуже. Вы можете делать такие вещи, как:

prototype.importPackage = null

или

prototype.Array = null

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

Изменить 3: IBM: вы сказали мне, что я могу использовать SSJS. ПРИХОДИТЕ ОДИН! ПОЖАЛУЙСТА, ПОЛУЧАЙТЕ ЭТО, это AWFUL. Просим официально сообщить об этом IBM.

Ответ 1

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

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

Это повторно инициализирует реестр и все функции прототипа.

EDIT: Изменено объявление fc на правильный тип.

ИЗМЕНИТЬ 2: Вот версия SSJS:

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

Я правильно вас понимаю, что вы хотите очистить интерпретатор SSJS, чтобы избежать столкновения с вашим собственным расширением прототипа? Чтобы прояснить ответ выше: это повторное инициализация интерпретатора SSJS. И только один раз. Вы должны делать это снова и снова, потому что сразу после повторной инициализации другое приложение на сервере может снова перезаписать функциональность прототипа. Вот почему это не настоящее решение, это ответ на ваш первоначальный вопрос.

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

Ответ 2

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