gpt4 book ai didi

xpages - 有人在 nsf 中使用 javascript 原型(prototype)后,如何清理 Domino 服务器中的 SSJS?

转载 作者:行者123 更新时间:2023-12-04 02:07:29 25 4
gpt4 key购买 nike

有人在 nsf 中使用 javascript 原型(prototype)后,如何在 Domino 服务器中清理 SSJS(服务器端 Javascript)?

Mark Roden 发现了一个 huge weakness在 XPages SSJS 中:(感谢 David Leedy 告诉我这件事并向我展示了这篇文章)。

如果您有以下 SSJS 代码:

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

XPages SSJS 不在乎您使用 变量 (var 表示变量必须是本地的)它使 dummyObj.NAME 在整个服务器中可见,值为 约翰 .因此,如果同一服务器中的另一个 nsf 使用具有相同名称的 var,它将继承整个原型(prototype):
var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */

这是一个巨大的错误(使 XPages SSJS IMO 不可靠的错误)。即使您根本不使用原型(prototype),如果他的应用程序中的其他人执行以下操作:
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 粉丝,但恕我直言 @MarkyRoden 在 SSJS 中发现了一个巨大的错误。垫片和 polyfill 并不是真正的主要问题。众所周知,Eval 是一种不好的做法,但原型(prototype)对象是基本 Javascript 的基本元素。这是向 Javascript 类添加方法的标准和首选方式,继承和各种 OOP stuff 也需要它。 .因此,您将需要某种服务器级别的命名空间以避免冲突。所有这一切都非常糟糕,但最大的问题是一个应用程序中的一行代码可能会破坏服务器中的所有应用程序。是的,您可以信任您的开发人员,但其中一个人可能会错误地写出糟糕的代码,而且 Domino 服务器可以拥有来自不同软件供应商的数百个应用程序。在代码审查中设置责任不是一个可靠的过程。也许是时候在 SSJS 中拥有一个真正的 javascript 引擎了,比如 V8、Spidermonkey、Chakra 或 Rhino。作为一种解决方法,我正在考虑类似 Tommy Valand 的 idea with Rhino in SSJS .

编辑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);

这将重新初始化注册表和所有原型(prototype)函数。

编辑:将 fc 的声明更改为正确的类型。

编辑 2:
这是 SSJS 版本:
var uiRoot = facesContext.getViewRoot();
var jsContext = uiRoot.getJSInterpreter().getJSContext();
var reg = jsContext.getRegistry();
reg.init( jsContext );

我是否正确理解您,您想清理 SSJS 解释器以避免与您自己的原型(prototype)扩展发生冲突?
只是为了澄清上面的答案:这会重新初始化 SSJS 解释器一次。而且只有一次。
您必须一遍又一遍地这样做,因为在重新初始化之后,服务器上的另一个应用程序可以再次覆盖原型(prototype)功能。这就是为什么这不是一个真正的解决方案,它是对您最初问题的回答。

如果另一个应用程序在您的代码尝试使用您的扩展程序时执行相同的操作,将会产生有趣的后果......

关于xpages - 有人在 nsf 中使用 javascript 原型(prototype)后,如何清理 Domino 服务器中的 SSJS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com