2016-05-17 11 views
0

Ich habe Probleme, Javascript eval() mit gwt zu verwenden.gwt jsni Variablenname verschleiert

Grundsätzlich hat ich in meiner DB eine dynamische Zeichenfolge, zum Beispiel:

"'31.07.' + (myVar.getMonth() <= 7 ? myVar.getFullYear() + 3: myVar.getFullYear() + 4)" 

meineVar soll ein Javascript-Variable vom Typ Datum.

Diese Variable wird über GWT JSNI geben:

private native String eval(Date dateFieldValue, String scriptlet) /*-{ 
    var myVar = dateFieldValue; 
    return $wnd.eval(scriptlet); 
}-*/; 

Aber die "myVar" Variable in der scriptlet Zeichenfolge nicht gefunden wird. Ich habe folgendes gefunden: https://support.google.com/code/answer/55205?hl=en

Das erklärt, warum dies passiert. müsste ich meine scriptlet so trennen:

"'31.07.' + (" + myVar + ".getMonth() <= 7 ? " + myVar + ".getFullYear() + 3: " + myVar + ".getFullYear() + 4)" 

Das Problem ist, dass dies nicht flexibel sein würde, da die scriptlet in der Datenbank verwaltet wird, nicht im Code. Was also in diesem Fall zu tun? Ist das unmöglich?

+0

Codeverschleierung ist eine Option, die Sie einfach ausschalten können. – Lista

+0

Aber gwt wird immer noch Variablennamen ändern, oder? Obwuscation zu drehen wäre zu viel, denke ich. – edu

+0

Ja, ich stimme zu, aber könnte in einem Moment der Verzweiflung eine Option sein. – Lista

Antwort

1

eine Funktion Verwenden Sie stattdessen:

return (new Function('myVar', 'return ' + scriptlet))(dateFieldValue); 

, die als eval sicherheits weise aber viel sauberer trotzdem noch so schlecht ist.

+0

Dies hätte das gleiche Problem, da der Scriptlet eine Zeichenfolge ist und gwt nicht innerhalb der Zeichenfolge liest. – edu

+0

Nein, es würde (bis zum Beweis des Gegenteils) nicht, weil 'myVar' jetzt ein String ist, der als Argument an 'new Function' übergeben wird, um sein Argument zu benennen, also wird er nicht von GWT neu geschrieben. Das ist im Grunde gleichbedeutend, wenn Sie das vorziehen, um 'eval ('function (myVar) {return' + scriptlet + '}') (dateFieldValue)' –

+0

Das klingt vielversprechend, danke! Ich habe verschiedene Varianten ausprobiert, aber es funktioniert immer noch nicht: Simple Scriptlet: 'String scriptlet =" myVar.getMonth() ";' und die Funktion: 'private native String eval (Datum myDate, String scriptlet)/* - { \t return (neue Funktion ('myVar', 'return' + Scriptlet)) (myDate); \t} - * /; 'aber ich bekomme:" myVar.getMonth ist keine Funktion ". Was mache ich falsch ? – edu