object.getClass().getDeclaredField(name);
Desensitize desensitize = field.getAnnotation(Desensitize.class);
if (desensitize == null) {
return value;
}
if (!(value instanceof String) || ((String) value).length() == 0) {
return value;
}
String valueStr = (String) value;
DesensitizeType type = desensitize.type();
switch (type) {
// 手机号脱敏
case MOBILE_PHONE:
return DesensitizedUtil.mobilePhone(valueStr);
// 车牌号脱敏
case LICENSE_NUMBER:
return DesensitizedUtil.carLicense(valueStr);
// 身份证号脱敏
case ID_CARD:
return DesensitizedUtil.idCardNum(valueStr, 3, 4);
// 银行卡脱敏
case BANK_CARD:
return DesensitizedUtil.bankCard(valueStr);
// 自定义脱敏
case CUSTOM:
return CharSequenceUtil.hide(valueStr, desensitize.startIndex(), desensitize.endIndex());
default:
break;
}
} catch (NoSuchFieldException e) {
return value;
}
return value;
}
}
然后在上面声明httpMessageConverters()的地方新增以下代码:
fastJsonConfig.setSerializeFilters(new Desensitizeva lueFilter());
此时,上文中自定义的脱敏注解中,@JacksonAnnotationsInside
和@JsonSerialize(using = DesensitizeSerializer.class)
可以移除:
再次运行验证,会发现自定义脱敏注解生效了:
4.3 注意影响范围
在VO的某个字段上加上@Desensitize(type = DesensitizeType.MOBILE_PHONE)
后,所有使用到该VO的接口,在返回数据时,
该字段都会被脱敏,如果列表页接口和详情接口共用了这个VO,但实际情况是列表页该字段需要脱敏,编辑页该字段不需要脱敏,
这种场景就需要特别注意。