繁体   English   中英

使用 groovy 评估 java 表达式

[英]Evaluate java expression using groovy

我在使用 groovy 评估 java 表达式时遇到了困难。 下面是我必须动态推送替换语句并对其进行评估的代码。 replaceSpecialChars 值来自用户输入。

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
String text =  "Disa";
System.out.println(text); //1
text = text.replace("s", "");
System.out.println(text); //2
String removeSpecialChars =  ".replace('a','')";
text = text + removeSpecialChars;
System.out.println(text); //3
engine.put("first", text);
System.out.println(engine.eval("first")); //4

4 个系统输出 -

Disa 
Dia 
Dia.replace('a','')
Dia.replace('a','')

预期产出 -

Disa
Dia
Dia.replace('a','')
Di

你应该能够做这样的事情:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
removeSpecialChars = ".replace('a','')";
text = "Dia";
engine.put("first", text);
result = engine.eval("first" + removeSpecialChars);
System.out.println(result);

通过调用engine.put("first", text); first使用 String Dia.replace('a','')作为值创建一个变量。 评估这个变量只是一个 noop,这就是为什么你再次得到与结果相同的值。

您还可以将上述内容缩短为

result = engine.eval("\"" + text + "\"" + removeSpecialChars);

在 glot.io 上试试: https ://glot.io/snippets/f4jyrbt92h

但是,您可能应该非常小心您允许的操作,并需要确保恶意用户输入不会破坏您的整个系统。 例如,如果用户输入是.replace('a',''); file("C:/Windows/").delete(); .replace('a',''); file("C:/Windows/").delete(); 这可能是您不想执行的操作。 通常,接受用户输入以进行动态代码执行会使您的系统成为各种漏洞利用的容易目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM