Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
皇甫嗷嗷叫
qlexpress
提交
20790aca
Q
qlexpress
项目概览
皇甫嗷嗷叫
/
qlexpress
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qlexpress
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
20790aca
编写于
6月 19, 2019
作者:
B
baoxingjie
提交者:
GitHub
6月 19, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增强新版本的api说明
增强新版本的api说明
上级
49b3440b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
39 addition
and
3 deletion
+39
-3
README.md
README.md
+39
-3
未找到文件。
README.md
浏览文件 @
20790aca
...
...
@@ -7,6 +7,13 @@
由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。
在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神,于2012年开源。
QLExpress脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性:
-
1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。
-
2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。
-
3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使业务的灵活度大大增强。
-
4、安全控制,可以通过设置相关运行参数,预防死循环、高危系统api调用等情况。
-
5、代码精简,依赖最小,250k的jar包适合所有java的运行环境,在android系统的低端pos机也得到广泛运用。
# 二、依赖和调用说明
```
xml
...
...
@@ -509,9 +516,38 @@ InstructionSet instructionSet = expressRunner.parseInstructionSet(expressString)
void clearExpressCache();
```
### (6)增强上下文参数Context相关的api
### (7)安全风险控制
#### 7.1 防止死循环
```
java
try {
express = "sum=0;for(i=0;i<1000000000;i++){sum=sum+i;}return sum;";
//可通过timeoutMillis参数设置脚本的运行超时时间:1000ms
Object r = runner.execute(express, context, null, true, false, 1000);
System.out.println(r);
throw new Exception("没有捕获到超时异常");
} catch (QLTimeOutException e) {
System.out.println(e);
}
```
#### 7.1 防止调用不安全的系统api
```
java
ExpressRunner runner = new ExpressRunner();
QLExpressRunStrategy.setForbiddenInvokeSecurityRiskMethods(true);
DefaultContext
<String
,
Object
>
context = new DefaultContext
<String
,
Object
>
();
try {
express = "System.exit(1);";
Object r = runner.execute(express, context, null, true, false);
System.out.println(r);
throw new Exception("没有捕获到不安全的方法");
} catch (QLException e) {
System.out.println(e);
}
```
### (8)增强上下文参数Context相关的api
####
6
.1 与spring框架的无缝集成
####
8
.1 与spring框架的无缝集成
上下文参数 IExpressContext context 非常有用,它允许put任何变量,然后在脚本中识别出来。
在实际中我们很希望能够无缝的集成到spring框架中,可以仿照下面的例子使用一个子类。
...
...
@@ -558,7 +594,7 @@ public class QLExpressContext extends HashMap<String, Object> implements
完整的demo参照 [SpringDemoTest.java](https://github.com/alibaba/QLExpress/blob/master/src/test/java/com/ql/util/express/test/spring/SpringDemoTest.java)
####
6
.2 自定义函数操作符获取原始的context控制上下文
####
8
.2 自定义函数操作符获取原始的context控制上下文
自定义的Operator需要直接继承OperatorBase,获取到parent即可,可以用于在运行一组脚本的时候,直接编辑上下文信息,业务逻辑处理上也非常有用。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录