如何禁用 JEXL 赋值?

How to disable JEXL assignments?

我有一个允许用户输入 JEXL 表达式的应用程序。它们用作搜索过滤器。用户常犯的一个常见错误是写类似“A=5”的内容,并期望当且仅当变量 A 包含值 5 时过滤器才为真。

是的,你是对的:= 运算符是赋值,用户应该使用 == 进行比较。 像拒绝与正则表达式 [^=]=[^=] 匹配的表达式这样的解决方法也不允许比较像 A=="foo=bar" 这样的字符串,所以它不是解决方案。

是否有机会通过运行时配置从 JexlEngine 中删除赋值运算符,以便它在解析期间抛出异常?或者发现 JexlExpression 包含赋值?

所以看起来 JEXL API 不提供对语法树的任何访问或定义允许的运算符。到目前为止对我有帮助的是修改 JexlContext.

的实现

通过重写 set 方法抛出异常,至少我在运行时遇到了错误。我仍然希望在表达式的解析时出现错误,但它可以节省时间。

如果您可以使用 JEXL 3.2 主干(即从源代码构建它),则可以通过 'features' 禁用副作用和全局副作用来实现此目的。

JexlFeatures features = new JexlFeatures().sideEffect(false).sideEffectGlobal(false);
...
JexlInfo info = ...
JexlScript script = jexl.createScript(features, info, source);
...

createScript 将抛出一个 JexlException.Feature 指示语法功能被禁用。