mobilenumber = mobilenumber.substring(0, 3) + "***"
+ mobilenumber.substring(length - 4, length);
@Desensitization(desensitization=DesensitizationEnum.MOBILE_PHONE)
private String mobilenumber;
ResponseVO> responseVO = custInfoService.selectCustInfoList(formMap);
LOGGER.info("条件查询客户列表查询结果:" + responseVO.getResult());
List
custInfolist = DesensitizationUtils.desensitizationList(custInfolist);
/**
* 脱敏工具
*/
public class DesensitizationUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(DesensitizationUtils.class);
/**
* 脱敏
* @param objList
* @return
*/
public static
List
for (T obj : objList) {
dobjList.add(desensitization(obj));
}
return dobjList;
}
/**
* 脱敏
* @param obj
* @return
*/
public static
try {
Class extends Object> clazz = obj.getClass();
//获取所有自己声明的属性
Field[] fields = clazz.getDeclaredFields();
//遍历属性
for (Field field : fields) {
//通过注解中的值来获取属性名(注解中的值应该与属性名相等)
Desensitization columnField = field.getAnnotation(Desensitization.class);
//如果是没有注解的属性忽略掉
if (null == columnField) {
continue;
}
String type = field.getGenericType().toString(); //获取属性的类型
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
Method rM = pd.getReadMethod();//获得读方法
Object oldValue = (Object) rM.invoke(obj);
Object newValue = oldValue;
if (null != oldValue) {
Method wM = pd.getWriteMethod();//获得写方法
DesensitizationEnum desensitizationValue = columnField.desensitization();
String doMethodName = "do"
+ desensitizationValue.toString().replace("_", "")
.substring(0, 1).toUpperCase()
+ desensitizationValue.toString().replace("_", "")
.toLowerCase().substring(1);
Method getMethod = DesensitizationUtils.class.getDeclaredMethod(doMethodName,
String.class, Object.class);
newValue = getMethod.invoke(DesensitizationUtils.class, type, oldValue);
wM.invoke(obj, newValue);
}
}
} catch (Exception e) {
LOGGER.error("脱敏处理失败{}", e);
}
return obj;
}
/**
* [中文姓名] 只显示第一个汉字,其他隐藏为星号<例子:李**>
*/
public static Object doChinesename(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用''
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
}
//字符串表示法
String fullName = oldValue.toString();
String name = StringUtils.left(fullName, 1);
return StringUtils.rightPad(name, fullName.length(), "*");
}
/**
* [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
* @return
*/
public static Object doIdcard(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用''
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
}
//字符串表示法
String id = oldValue.toString();
int length = id.length();
if (length <= 4) {
return id;
}
String num = StringUtils.right(id, 4);
return StringUtils.leftPad(num, id.length(), "*");
}
/**
* [固定电话] 后四位,其他隐藏<例子:****1234>
*/
public static Object doFixedphone(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用''
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
}
//字符串表示法
String num = oldValue.toString();
int length = num.length();
if (length <= 4) {
return num;
}
return StringUtils.leftPad(StringUtils.right(num, 4), num.length(), "*");
}
/**
* [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>
*
* @return
*/
public static Object doMobilephone(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用''
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
}
//字符串表示法
String mobilnumber = oldValue.toString();
int length = mobilnumber.length();
if (length <= 7) {
return mobilnumber;
}
return StringUtils.left(mobilnumber, 3).concat(
StringUtils.removeStart(
StringUtils.leftPad(StringUtils.right(mobilnumber, 4), mobilnumber.length(), "*"),
"***"));
}
/**
* [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>
*/
public static Object doAddress(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用''
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
}
//字符串表示法
String address = oldValue.toString();
int length = address.length();
if (length <= 2) {
return address;
}
return StringUtils.rightPad(StringUtils.left(address, length / 2), length, "*");
}
/**
* [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com>
*/
public static Object doEmail(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用''
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
}
//字符串表示法
String email = oldValue.toString();
int index = StringUtils.indexOf(email, "@");
if (index <= 1) {
return email;
}
return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(
StringUtils.mid(email, index, email.length()));
}
/**
* [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>
*/
public static Object doBankcard(String type, Object oldValue) {
//判断字符串,多个中满足任何一个用IN,并使用''
if (!type.equals("class java.lang.String")) {
LOGGER.info("不支持的数据类型{}", type);
throw new RuntimeException("不支持的数据类型");
}
//字符串表示法
String cardNum = oldValue.toString();
int length = cardNum.length();
if (length <= 10) {
return cardNum;
}
return StringUtils.left(cardNum, 6).concat(
StringUtils.removeStart(
StringUtils.leftPad(StringUtils.right(cardNum, 4), length, "*"), "******"));
}
}