通过注解序列化的形式进行数据脱敏,减少代码量增加代码可读性
使用方式:
属性字段上添加@Sensitive(type = "MOBILE")
自定义注解类:
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.scm.product.serialize.SensitiveJsonSerializer;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据脱敏
* @date 2023/5/8 16:32
* @author luohao
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
/**
* MOBILE 手机号
* CARDID 身份证
* @return
*/
String type();
}
序列化类:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.scm.product.annotation.Sensitive;
import java.io.IOException;
import java.util.Objects;
/**
* 数据脱敏序列化
* @date 2023/5/8 16:33
* @author luohao
*/
@JacksonStdImpl
public class SensitiveJsonSerializer extends JsonSerializer implements ContextualSerializer {
private String type;
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
switch (type){
case "MOBILE":
gen.writeString(DesensitizedUtil.mobilePhone(value)); //手机号
case "CARDID":
gen.writeString(DesensitizedUtil.idCardNum(value, 5, 2)); //身份证
default:
gen.writeString("***");
}
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
Sensitive annotation = property.getAnnotation(Sensitive.class);
if (Objects.nonNull(annotation)) {
this.type = annotation.type();
return this;
}
return prov.findValueSerializer(property.getType(), property);
}
}