ElementType.FIELD})
(RetentionPolicy.RUNTIME)
(using = DesensitizedSerializer.class)
public @interface Desensitized {
SensitiveTypeEnum sensitiveType() default SensitiveTypeEnum.PHONE;
}
({
public class DesensitizedSerializer extends JsonSerializer<String> implements ContextualSerializer {
private SensitiveTypeEnum sensitiveType;
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (this.sensitiveType == null || StringUtils.isEmpty(value)) {
gen.writeString(value);
return;
}
switch (this.sensitiveType) {
case NAME:
gen.writeString(StringUtils.overlay(value, StringUtils.repeat('*', value.length() - 1), 1, value.length()));
break;
case ID_CARD:
gen.writeString(StringUtils.overlay(value, "***********", 3, value.length() - 4));
break;
case PHONE:
gen.writeString(StringUtils.overlay(value, "****", 3, value.length() - 4));
break;
default:
break;
}
}
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
if (property != null) {
Desensitized desensitized = property.getAnnotation(Desensitized.class);
if (desensitized == null) {
desensitized = property.getContextAnnotation(Desensitized.class);
}
if (desensitized != null) {
this.sensitiveType = desensitized.sensitiveType();
}
}
return this;
}
}