正文
PrivacyTypeEnum
type
()
default
PrivacyTypeEnum.CUSTOMER
;
/**
* 前置不需要打码的长度
*/
int
prefixNoMaskLen
()
default
0
;
/**
* 后置不需要打码的长度
*/
int
suffixNoMaskLen
()
default
0
;
/**
* 用什么打码
*/
String
maskStr
()
default
"*"
;
}
序列化类
public class PrivacySerialize extends JsonSerializer<String> implements ContextualSerializer {
publicstaticfinal Logger logger = LoggerFactory.getLogger(PrivacySerialize.class);
private PrivacyTypeEnum type;
private Integer prefixNoMaskLen;
private Integer suffixNoMaskLen;
private String maskStr;
public PrivacySerialize(PrivacyTypeEnum type, Integer prefixNoMaskLen, Integer suffixNoMaskLen, String maskStr) {
this.type = type;
this.prefixNoMaskLen = prefixNoMaskLen;
this.suffixNoMaskLen = suffixNoMaskLen;
this.maskStr = maskStr;
}
public PrivacySerialize() {
}
@Override
public void serialize(String origin,JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException {
if (StringUtils.isNotBlank(origin) && null != type) {
switch (type) {
case CHINESE_NAME:
jsonGenerator.writeString(DesensitizedUtils.chineseName(origin));
break;
case ID_CARD:
jsonGenerator.writeString(DesensitizedUtils.idCardNum(origin));
break;
case FIXED_PHONE:
jsonGenerator.writeString(DesensitizedUtils.fixedPhone(origin));
break;
case MOBILE_PHONE:
jsonGenerator.writeString(DesensitizedUtils.mobilePhone(origin));
break;
case ADDRESS:
jsonGenerator.writeString(DesensitizedUtils.address(origin));
break;
case EMAIL:
jsonGenerator.writeString(DesensitizedUtils.email(origin));
break;
case BANK_CARD:
jsonGenerator.writeString(DesensitizedUtils.bankCard(origin));
break;
case PASSWORD:
jsonGenerator.writeString(DesensitizedUtils.password(origin));
break;
case KEY:
jsonGenerator.writeString(DesensitizedUtils.key(origin));
break;
case CUSTOMER:
jsonGenerator.writeString(DesensitizedUtils.desValue(origin, prefixNoMaskLen, suffixNoMaskLen, maskStr));
break;
default:
thrownew IllegalArgumentException("Unknow sensitive type enum " + type);
}
}else {
jsonGenerator.writeString("");
}
}
@Override
public JsonSerializer> createContextual(SerializerProvider serializerProvider,BeanProperty beanProperty) throws JsonMappingException {
if (beanProperty != null) {
if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
PrivacyEncrypt encrypt = beanProperty.getAnnotation(PrivacyEncrypt.class);
if (encrypt == null) {
encrypt = beanProperty.getContextAnnotation(PrivacyEncrypt.class);
}
if (encrypt != null) {
returnnew PrivacySerialize(encrypt.type(), encrypt.prefixNoMaskLen(),
encrypt.suffixNoMaskLen(), encrypt.maskStr());
}
}
return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
}
return serializerProvider.findNullValueSerializer(null);
}
}
脱敏工具类
/**
* 脱敏工具类
*
**/
publicclass DesensitizedUtils {
/**
* 对字符串进行脱敏操作
* @param origin 原始字符串
* @param prefixNoMaskLen 左侧需要保留几位明文字段
* @param suffixNoMaskLen 右侧需要保留几位明文字段
* @param maskStr 用于遮罩的字符串, 如'*'
* @return 脱敏后结果
*/
public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) {
if (origin == null) {
returnnull;
}
StringBuilder sb = new StringBuilder();
for (int i = 0, n = origin.length(); i < n; i++) {
if (i < prefixNoMaskLen) {
sb.append(origin.charAt(i));
continue;
}
if (i > (n - suffixNoMaskLen - 1)) {
sb.append(origin.charAt(i));
continue;
}
sb.append(maskStr);
}
return sb.toString();
}
/**
* 【中文姓名】只显示最后一个汉字,其他隐藏为星号,比如:**梦
* @param fullName 姓名
* @return 结果
*/
public static String chineseName(String fullName) {
if (fullName == null) {
returnnull;
}
return desValue(fullName, 0, 1, "*");
}
/**
* 【身份证号】显示前六位, 四位,其他隐藏。共计18位或者15位,比如:340304*******1234
* @param id 身份证号码
* @return 结果
*/
public