有人在nsf中使用javascript原型后,如何在Domino服务器中清除SSJS(服务器端Javascript)?
马克·罗登(Mark Roden)发现了XPages SSJS的一个巨大缺陷:(感谢大卫·李迪(David Leedy)告诉我这件事,并向我展示了这篇文章)。
如果您具有以下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()的同一服务器上的所有应用程序。
因此,问题是:如果有人“错误地”在NSF中编写了以下SSJS(XPages服务器端Javascript):
String.prototype.split = function(){ return "I broke this method" }
如何将String.prototype.split()修复为其原始值?
正如Mark Roden所说,重新启动HTTP任务并不能解决它。
//////////////////////////////////////////////////// /////////
编辑1:为什么我认为这是一个巨大的错误:
我是Javascript迷,但是恕我直言@MarkyRoden发现了SSJS中的一个巨大错误。垫片和填充料并不是真正的主要问题。众所周知,Eval是一种不好的做法,但是原型对象是基本Javascript的基本元素。这是将方法添加到Javascript类的标准和首选方式,继承和各种OOP东西也需要它。因此,您将需要在服务器级别使用某种命名空间,以避免发生冲突。所有这一切确实很糟糕,但是一个巨大的问题是,一个应用程序中只有一行代码会破坏服务器中的所有应用程序。是的,您可以信任您的开发人员,但是其中一位开发人员可能会错误地写一条糟糕的话,而且Domino服务器可以包含来自不同软件供应商的数百个应用程序。在代码审查中设置责任不是一个可靠的过程。也许是时候在SSJS中使用真正的JavaScript引擎了,例如V8,Spidermonkey,Chakra或Rhino。作为一种解决方法,我正在考虑类似Tommy Valand与SSJS中的Rhino的想法。
编辑2:更糟糕的是。您可以执行以下操作:
prototype.importPackage = null
要么
prototype.Array = null
如您在@SvenHasselbach的文章中所见:http ://hasselba.ch/blog/?p=1371
编辑3:IBM:您告诉我可以使用SSJS。来一个!请解决此问题,这是可怕的。请让我们正式向IBM报告此问题。
您可以使用以下Java代码重置SSJS解释器:
FacesContextExImpl fc = (FacesContextExImpl) FacesContextExImpl.getCurrentInstance();
UIViewRootEx2 uiRoot = (UIViewRootEx2) fc.getViewRoot();
JSContext jsContext = uiRoot.getJSInterpreter().getJSContext();
jsContext.getRegistry().init(jsContext);
这将重新初始化注册表和所有原型功能。
编辑:将fc的声明更改为正确的类型。
编辑2:这是SSJS版本:
var uiRoot = facesContext.getViewRoot();
var jsContext = uiRoot.getJSInterpreter().getJSContext();
var reg = jsContext.getRegistry();
reg.init( jsContext );
我是否正确理解您的意思,就是要清理SSJS解释器以避免与您自己的原型扩展冲突?只是为了澄清上面的答案:这一次重新初始化SSJS解释器。而且只有一次。您必须一遍又一遍地执行此操作,因为在重新初始化之后,服务器上的另一个应用程序可以立即再次覆盖原型功能。这就是为什么这不是一个真正的解决方案,而是对您最初的问题的解答。
如果其他应用程序在您的代码尝试使用扩展程序时执行相同的操作,则会产生严重的后果...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句