如果有人在nsf中使用javascript原型,如何在Domino服务器中清理SSJS(服务器端Javascript)?
马克罗登发现了一个 巨大的弱点 在XPage SSJS :(感谢David Leedy告诉我这个并向我展示这篇文章)。
如果您有以下SSJS代码:
var dummyObj = {}
dummyObj.prototype.NAME = "Johann"
XPages SSJS并不关心你使用 VAR (var表示变量必须是本地的)并且它是 dummyObj.NAME 在整个服务器中可以看到值 约翰。因此,如果同一服务器中的另一个nsf使用具有相同名称的var,则它将继承整个原型:
var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */
这是一个巨大的错误(一个使得不可靠的XPage SSJS IMO)。即使你根本不使用原型,如果他的应用程序中的其他人做了类似这样的事情:
String.prototype.split = function(){ return "I broke this method" }
它将破坏使用无辜者的同一服务器中的所有应用程序 分裂()。
所以,问题是:如果有人“错误地”在NSF中写下以下SSJS(XPages服务器端Javascript):
String.prototype.split = function(){ return "I broke this method" }
如何将String.prototype.split()修复为原始值?
正如Mark Roden所说,重启HTTP任务并不能解决问题。
////////////////////////////////////////////////// /////////
编辑1:为什么我认为这是一个巨大的错误:
我是Javascript粉丝但IMHO @MarkyRoden在SSJS中发现了一个巨大的错误。垫片和填充物实际上不是主要问题。已知Eval是一种不好的做法,但原型对象是基本Javascript的基本元素。这是向Javascript类添加方法的标准和首选方法,它也需要继承和各种类型 OOP的东西。因此,您需要在服务器级别使用某种命名空间以避免冲突。所有这些都非常糟糕,但最大的问题是,一个应用程序中的一行代码可能会破坏服务器中的所有应用程序。是的,您可以信任您的开发人员,但其中一个人可能会错误地编写错误的行,并且Domino服务器可以拥有来自不同软件供应商的数百个应用程序。在代码审查中设置责任不是一个可靠的程序。也许是时候在SSJS中拥有一个真正的javascript引擎,比如V8,Spidermonkey,Chakra或Rhino。作为一种解决方法,我正在想像Tommy Valand这样的东西 与SSJS中的犀牛的想法。
编辑2:情况更糟。你可以这样做:
prototype.importPackage = null
要么
prototype.Array = null
正如你在@SvenHasselbach的文章中看到的那样: http://hasselba.ch/blog/?p=1371
编辑3:IBM:你告诉我我可以使用SSJS。来吧!请修复它,它是AWFUL。请让我们正式向IBM报告此问题。