Jak wyczyścić SSJS (JavaScript po stronie serwera) w serwerze Domino po tym, jak ktoś użył prototypu javascript w pliku nsf?Jak wyczyścić SSJS na serwerze Domino po tym, jak ktoś użył prototypu javascript w nsf?
Mark Roden odkrył huge weakness w XPages SSJS: (podziękowania dla Davida Leedy'ego za opowiadanie mi o tym i pokazanie mi artykułu).
Jeśli masz następujący kod SSJS:
var dummyObj = {}
dummyObj.prototype.NAME = "Johann"
XPages SSJS nie obchodzi, że używa var (var oznacza zmienna musi być lokalna) i to sprawia dummyObj.NAME widoczne w cały serwer o wartości Johann. Więc jeśli inny NSF w tym samym serwerze używa var o tej samej nazwie dziedziczy cały prototype:
var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */
To ogromny błąd (taki, który sprawia, że nierzetelne XPages SSJS IMO). Nawet jeśli nie używasz prototyp w ogóle, jeśli ktoś w swoim wniosku zrobić coś takiego:
String.prototype.split = function(){ return "I broke this method" }
Będzie on złamał wszystkie aplikacje w tym samym serwerze, który korzysta z niewinną split().
Więc pytanie brzmi: czy ktoś "przez pomyłkę" pisze następujące SSJS (XPages Server Side JavaScript) w NSF:
String.prototype.split = function(){ return "I broke this method" }
Jak można naprawić String.prototype.split(), aby jego oryginalna wartość?
Jak powiedział Mark Roden, ponowne uruchomienie zadania HTTP nie naprawić.
////////////////////////////////////////////// /////////////
Edit 1: Dlaczego myślę, że jest to ogromny błąd:
Jestem fanem Javascript ale IMHO @MarkyRoden odkrył ogromny błąd w SSJS . Podkładki i polyfills nie są tak naprawdę głównym problemem. Eval jest złą praktyką, ale prototypowy obiekt jest podstawowym elementem podstawowego Javascriptu. Jest to standardowy i preferowany sposób dodawania metod do klas JavaScript, jest również potrzebny do dziedziczenia i wszelkiego rodzaju OOP stuff. Potrzebujesz więc przestrzeni nazw na poziomie serwera, aby uniknąć kolizji. Wszystko to jest naprawdę złe, ale ogromnym problemem jest to, że linia kodu w jednej aplikacji może zepsuć wszystkie aplikacje na serwerze. Tak, możesz ufać swoim programistom, ale jeden z nich może przez pomyłkę napisać błędną linię, a także serwer Domino może mieć setki aplikacji od różnych dostawców oprogramowania. Ustalenie odpowiedzialności w przeglądach kodu nie jest niezawodną procedurą. Być może nadszedł czas, aby mieć prawdziwy silnik javascript w SSJS, taki jak V8, Spidermonkey, Chakra lub Rhino. Jako obejście, myślę w czymś takim jak Tommy Valand's idea with Rhino in SSJS.
Edit 2: Jest jeszcze gorzej.Można robić takie rzeczy jak:
prototype.importPackage = null
lub
prototype.Array = null
Jak widać w @ SvenHasselbach w artykule: http://hasselba.ch/blog/?p=1371
Edycja 3: IBM: Powiedziałeś mi, że mogę korzystać z SSJS. PRZYJDŹ JEDEN! PROSZĘ USUNĄĆ TEN, to jest PIĘKNE. Oficjalnie zgłoś ten problem IBM.
chodzi komentarze edytować. Myślę, że kluczowe jest to, że SSJS NIE jest "prawdziwym JavaScript". Musisz więc odpowiednio zarządzać swoimi oczekiwaniami SSJS. Zwłaszcza z OOP. Naprawdę nie możesz robić obiektów w SSJS. Jeśli umieścisz kod w swoich funkcjach, nie będzie można ich edytować w Serializacji. Szczerze wierzę, że prawdziwym rozwiązaniem jest użycie Java zamiast SSJS. –
To jeszcze jeden powód, dla którego używasz jak najwięcej Java i EL w rozwoju XPages zamiast SSJS. –
Zgadzam się z Knutem i Davidem. Zastanów się także, co Jesse Gallagher zrobił kilka lat temu, aby umożliwić ci kodowanie Ruby w XPages: XPages jest platformą opartą na JSF, działającą w wirtualnej maszynie Java, więc aby umożliwić ludziom kodowanie Ruby, Jesse musiał napisać mechanizm analizowania, aby umożliwić Java do parsowania Ruby. Parser Rhino robi to samo - używa klasy Java, aby powiedzieć Java, jak parsować Rhino. Więc jeśli nie rozumiem rzeczy, nie możesz mieć prawdziwego silnika javascript w SSJS, ponieważ będziesz używał parsera Java dla tego silnika javascript. Debugowanie może być również wyzwaniem. –