项目中有一个需求,需要将列表中敏感数据做屏蔽,屏蔽数据根据字段数据的不同,也有对应的屏蔽规则。例如:身份证号、手机号、电话、地址等。大致需求就是这样,即根据脱敏规则,对敏感数据做脱敏屏蔽处理。
项目中有很多列表页面,对应的数据库表字段名称也都不一样,如果使用if else 方式去实现,对每个列表接口数据做判断,性能暂且不说,势必会造成代码冗余,使代码阅读性降低,更改起来非常麻烦。
这里想一个思路,
1、先在写一个屏蔽规则方法类(这里命名为MaskingFunction)类中使用java静态方法,实现每种数据的屏蔽规则。
2、然后再写一个配置类(MaskingConfig),将实体类对应的有屏蔽要求的字段的屏蔽规则,配置保存到Map中。
3、最后写一个工具类,这个类传入两个参数,一个是实体类名称(tabName)、一个是要屏蔽的数据(List<Map>)。根据实体类名称可以从配置类中查询到字段的屏蔽规则,然后再循环操作对数据做处理。
代码如下:
MaskingFunction类。实现每种屏蔽规则
package com.ruoyi.masking;
import org.apache.commons.lang3.StringUtils;
/**
* 敏感数据屏蔽规则的实现方法类
*/
public class MaskingFunction {
public static final String replace = "******";
public static final String replace2 = "*";
/**
* 身份证号屏蔽规则实现方法
* 保存前六位,和末尾两位,中间用星号替换
* @param idCard 身份证号
* @return 加工后返回的数据
*/
public static String idCardF(String idCard){
if(StringUtils.isBlank(idCard)){
return idCard;
}
int length = idCard.length();
if(length <= 8){
return idCard;
}
return idCard.substring(0,6) + replace + idCard.substring(length-2);
}
/**
* 手机号屏蔽规则实现方法
* 保存前三位和后四位,中间四位用星号替换
* @param phone
* @return
*/
public static String phoneF(String phone){
if(StringUtils.isBlank(phone)){
return phone;
}
int length = phone.length();
if(length <= 7){
return phone;
}
return phone.substring(0,3) + "****" + phone.substring(leng