网站首页 > java教程 正文
背景
我之前写了一篇关于使用注解和策略模式实现数据脱敏功能,其中使用策略模式用来消除if语句,实现业务与条件逻辑的解耦,有利于功能的扩展。
使用策略模式实现数据脱敏:
简单回顾下这篇文章的脱敏功能,原数据:
public UserInfo getUserInfo() {
UserInfo userInfo = new UserInfo();
userInfo.setAge(23);
userInfo.setIdCard("32133458888988771");
userInfo.setMobile("13456782345");
userInfo.setNativePlace("北京海定区");
userInfo.setSex("男");
userInfo.setUseId(1234567L);
userInfo.setUseName("爱德华");
userInfo.setUseNo("11");
return userInfo;
}
要求对身份证和手机号实现数据脱敏
@Data
public class UserInfo {
private Long useId;
/**
* 用户编号
*/
private String useNo;
/**
* 用户姓名
*/
private String useName;
/**
* 用户手机号
*/
@SensitiveInfo(SensitiveType.MOBILE_PHONE)
private String mobile;
/**
* 用户性别
*/
private String sex;
/**
* 用户年龄
*/
private int age;
/**
* 用户籍贯
*/
private String nativePlace;
/**
* 用户身份证
*/
@SensitiveInfo(SensitiveType.ID_CARD)
private String idCard;
}
这里对脱敏的字段标上了脱敏注解。
脱敏效果
使用if语句处理每种类型的脱敏情况
代码中有用if语句处理各个类型的脱敏,这是一般情况,使用if语句将业务代码与条件代码混到一起,不利于类型的拓展,这个问题上篇文章有讲到。
解决办法是使用了策略模式消除了if语句。今天我们来使用规则引擎消除if语句,代码案例同样是脱敏功能实现。
规则引擎 Easy Rules
规则引擎就是提供一种可选的计算模型。与通常的命令式模型(由带有条件和循环的命令依次组成)不同,规则引擎基于生产规则系统。这是一组生产规则,每条规则都有一个条件(condition)和一个动作(action)———— 简单地说,可以将其看作是一组if-then语句。
精妙之处在于规则可以按任何顺序编写,引擎会决定何时使用对顺序有意义的任何方式来计算它们。考虑它的一个好方法是系统运行所有规则,选择条件成立的规则,然后执行相应的操作。
Easy Rules是一个开源的规则引擎框架,它提供Rule抽象以创建具有条件和动作的规则,并提供RuleEngine API,该API通过一组规则运行以评估条件并执行动作。
导入Easy Rules规则引擎Maven包
<!--规则引擎-->
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-core</artifactId>
<version>4.0.0</version>
</dependency>
编写规则类
我们编写了如下的规则类:
定义规则接口
接口用于规范规则方法
具体规则类实现举例
这里在类上定义Rule注解,表明Rule的名称和描述。类里面实现3个方法:
getCurrentSensitiveType():获取当前的枚举类型
isCurrentType():规则判断,方法上标上@Condition注解,说明这个方法是规则判断的条件。参数中的@Fact注解,可以将条件方法中的参数传到下面的执行方法中。
maskingData():执行方法,标上@Action注解,当isCurrentType()为真时,会执行该方法。
注册所有规则
我通过规则接口获取所有的规则实现类实例,然后注意注册到规则引擎中,最后执行规则。我们来看看详细的执行过程。
想要执行规则,我们首先需要创建一个Fact实例,这个实例用于存储条件判断的参数。
Fact内部是一个HashSet容器:
name的值我们可以自定义,value的值是脱敏注解传过来的信息。
接着需要将Rule实例注册到Rules中,这里我们通过Spring的特性获取到了接口SensitiveRule的所有示例:
最后执行Rule,当规则满足,就会执行规则定义的方法:
RuleEntity实体类内容
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class RuleEntity {
SensitiveType type;
String infoStr;
}
RuleMapService中的map存放处理后的脱敏数据
public class RuleMapService {
public static Map<String, String> getMap() {
return map;
}
private static Map<String,String> map = Maps.newHashMap();
}
调用RuleService#execute方法,处理脱敏数据:
最后效果:
我们看到电话号码和身份证信息做了脱敏处理。
本篇文章简要的介绍如何使用规则引擎消除if语句,实现数据脱敏。关于规则引擎的详细使用可以看看这篇文章:
[Easy-Rules: Easy Rules 是开源的 Java 规则引擎 (gitee.com)]-(https://gitee.com/mirrors/Easy-Rules)
关于规则引擎使用代码可以私信我获取。
如果这篇文章对你有所帮助,欢迎点赞和转发。
猜你喜欢
- 2024-10-25 Spring Boot 整合流程引擎 Flowable,so easy
- 2024-10-25 规则引擎重塑业务灵活性,但是你真的会用吗?
- 2024-10-25 Java表达式求值引擎Aviator(二)(java数学表达式解析)
- 2024-10-25 高德打车通用可编排订单状态机引擎设计
- 2024-10-25 NET RulesEngine(规则引擎)(规则引擎easy rule)
- 2024-10-25 25-规则引擎概述(使用规则引擎的优势)
- 2024-10-25 开启灵活开发编码模式:规则引擎drools——LHS部分
- 2024-10-25 21-规则引擎内容介绍(规则引擎使用案例场景)
- 2024-10-25 Aviator规则引擎最佳实践(规则引擎教程)
- 2024-10-25 开源规则引擎LiteFlow:为低代码开发带来革命性的变革
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)