java - 如何禁用 JEXL 分配?
问题描述
我有一个允许用户输入JEXL表达式的应用程序。它们用作搜索过滤器。用户犯的一个常见错误是编写类似“A=5”的内容,并且当且仅当变量 A 包含值 5 时才期望过滤器为真。
是的,你是对的:= 运算符是赋值,用户应该使用 == 进行比较。像拒绝匹配正则表达式 [^=]=[^=] 的表达式这样的解决方法也不允许比较像 A=="foo=bar" 这样的字符串,因此它不是解决方案。
是否有机会通过运行时配置从 JexlEngine 中删除赋值运算符,以便在解析期间抛出异常?或者发现 JexlExpression 包含一个赋值?
解决方案
如果您可以使用 JEXL 3.2 主干(即从源代码构建它),则可以通过“功能”通过禁用副作用和全局副作用来实现此目的。
JexlFeatures features = new JexlFeatures().sideEffect(false).sideEffectGlobal(false);
...
JexlInfo info = ...
JexlScript script = jexl.createScript(features, info, source);
...
createScript 将抛出 JexlException.Feature 指示语法功能已禁用。
推荐阅读
- java - Apache POI XmlException 主题 (http://purl.oclc.org/ooxml/drawingml)
- javascript - 在单元格 Jquery 事件中没有触发,但其他所有链接都会触发
- android - 如何使用当前链接自动从 chrome 自定义选项卡重定向回应用程序?
- java - Java中基于String的目标变量
- python-3.x - 如何使用字典更新数据框中的 NaN 值
- javascript - CRM 9 - 使用 JavaScript WebResource 根据 ID 从 CRM 实体中获取记录
- android - 如何从 Android Studio 为 Flutter 构建签名的 apk
- node.js - 如何强制节点等待 aws promise 解决?
- r - 如何计算 r 中变量的总和
- react-native - React Native Android 应用程序的发布版本在尝试通过 HTTPS 访问 API 时出现“一般网络错误”