/**
* 函数式接口
*/
@FunctionalInterface
public interface StringFunction {
/**
* 函数调用方法
*
* @param s
* @return
*/
String apply(String s);
}
public class MaskUtils {
/**
* 隐藏手机号
*
* @param mobile
* @return
*/
public static String maskMobile(String mobile) {
if (StringUtils.isEmpty(mobile) || (mobile.length() != 11)) {
return mobile;
}
return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
/**
* 隐藏邮箱信息
*
* @param email
* @return
*/
public static String maskEmail(String email) {
if (StringUtils.isEmpty(email)) {
return email;
}
return email.replaceAll("(\\w+)\\w{3}@(\\w+)", "$1***@$2");
}
/**
* 隐藏身份证号码
*
* @param id
* @return
*/
public static String maskIdCardNo(String id) {
if (StringUtils.isEmpty(id) || (id.length() < 8)) {
return id;
}
return id.replaceAll("(?<=\\w{6})\\w(?=\\w{6})", "*");
}
/**
* 对实体列表脱敏
*
* @param datas
* @param <T>
* @return
*/
@SuppressWarnings("uncheck")
public static <T> List<T> maskList(List<T> datas) {
datas.forEach(MaskUtils::maskObject);
return datas;
}
/**
* 对单实体脱敏
*
* @param data
* @param <T>
* @return
*/
@SuppressWarnings("uncheck")
public static <T> T maskObject(T data) {
Class clazz = data.getClass();
Stream.of(clazz.getDeclaredFields()).forEach(f -> {
Mask mask = f.getAnnotation(Mask.class);
if (mask != null) {
String fName = f.getName();
try {
String methodName = fName.substring(0, 1).toUpperCase() + fName.substring(1);
Method getMethod = clazz.getMethod("get" + methodName, null);
Method setMethod = clazz.getMethod("set" + methodName, String.class);
StringFunction sf = null;
if (mask.dataType() == Mask.DataType.MOBILE) {
sf = MaskUtils::maskMobile;
} else if (mask.dataType() == Mask.DataType.EMAIL) {
sf = MaskUtils::maskEmail;
} else if (mask.dataType() == Mask.DataType.ID_CARD) {
sf = MaskUtils::maskIdCardNo;
}
if (sf != null) {
setMethod.invoke(data, sf.apply(getMethod.invoke(data, null).toString()));
}
} catch (Exception e) {
}
}
});
return data;
}
}
import java.util.Arrays;
import java.util.List;
public class MaskUtilsTest {
@Test
public void testMaskStr() {
System.out.println(MaskUtils.maskMobile("15574307649"));
System.out.println(MaskUtils.maskIdCardNo("362201199009191811"));
System.out.println(MaskUtils.maskEmail("coupman@sina.com"));
}
@Test
public void testMaskList() {
Data data = new Data();
data = MaskUtils.maskObject(data);
List<Data> dataList = MaskUtils.maskList(Arrays.asList(data));
System.out.println(data.toString());
}
@lombok.Data
public static class Data {
@Mask(dataType = Mask.DataType.MOBILE)
private String mobile = "15574307649";
@Mask(dataType = Mask.DataType.EMAIL)
private String email = "coupman@sina.com";
@Mask(dataType = Mask.DataType.ID_CARD)
private String idCard = "362201199009191811";
}
}