如果有人在nsf中使用javascript原型,如何清理Domino服务器中的SSJS(服务器端Javascript)?
马克·罗登发现了XPage SSJS的一个巨大弱点 :(感谢David Leedy告诉我这件事并向我展示这篇文章).
如果您有以下SSJS代码:
var dummyObj = {}
dummyObj.prototype.NAME = "Johann"
Run Code Online (Sandbox Code Playgroud)
XPages SSJS并不关心你使用var(var表示变量必须是本地的),它使dummyObj.NAME在整个服务器中可见,其值为Johann.因此,如果同一服务器中的另一个nsf使用具有相同名称的var,则它将继承整个原型:
var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */
Run Code Online (Sandbox Code Playgroud)
这是一个巨大的错误(一个使得不可靠的XPage SSJS IMO).即使你根本不使用原型,如果他的应用程序中的其他人做了类似这样的事情:
String.prototype.split = function(){ return "I broke this method" }
Run Code Online (Sandbox Code Playgroud)
它将破坏使用无辜split()的同一服务器中的所有应用程序.
所以,问题是:如果有人"错误地"在NSF中写下以下SSJS(XPages服务器端Javascript):
String.prototype.split = function(){ return "I broke this method" }
Run Code Online (Sandbox Code Playgroud)
如何将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中与Rhino的想法.
编辑2:情况更糟.你可以这样做:
prototype.importPackage = null
Run Code Online (Sandbox Code Playgroud)
要么
prototype.Array = null
Run Code Online (Sandbox Code Playgroud)
正如你在@SvenHasselbach的文章中看到的那样:http …
我用java类(Invoke)创建了一个java库(名为:invoke).在设计器导航窗格中的代码下扩展脚本库时可以看到它.
代码是:
package com.kkm.vijay;
public class Invoke {
public static void main(String[] args) {
Runtime r = Runtime.getRuntime();
Process p = r.exec("C://some.exe");
}
}
Run Code Online (Sandbox Code Playgroud)
将以下ssjs用于按钮的onclick事件,在浏览器中预览时显示Error:500.
importPackage(com.kkmsoft.vijay);
var v=new Invoke();
v.main();
Run Code Online (Sandbox Code Playgroud)
甚至我在类中使用了一个函数,并将ssjs的最后一行更改为v.fn().然而同样的问题.