java实现手机号脱敏

发布时间 2023-03-22 21:11:27作者: 我叫福禄娃

自定义一个注解(需要依赖jackson。jar包)

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
SensitiveStrategy starategy();
}

定义一个枚举类SensitiveStrategy(仅支持java8以后,8以前没有Function方法)
public enum SensitiveStrategy {

ID_CARD(s -> s.replaceAll("^(.{3})(?:\\d+)(.{4})","$1****$2")),
PHONE(s -> s.replaceAll("^(.{3})(?:\\d+)(.{4})","$1****$2")),
ADDRESS(s -> s.replaceAll("^(.{2})(?:\\S+)(.{2})","$1****$2")),
BANKCARD(s -> s.replaceAll("^(.{5})(?:\\d+)(.{5})","$1****$2"));


private final Function<String,String> desensitizer;

SensitiveStrategy(Function<String,String> desensitizer){
this.desensitizer = desensitizer;
}

public Function<String,String> desensitizer(){
return desensitizer;
}
}

定义一个序列化器SensitiveJsonSerializer
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {

private SensitiveStrategy strategy;

@Override
public void serialize(String value, JsonGenerator generator, SerializerProvider serializerProvider) throws IOException {
generator.writeString(strategy.desensitizer().apply(value));
}

@Override
public JsonSerializer<?> createContextual(SerializerProvider provider, BeanProperty property) throws JsonMappingException {
Sensitive annotation = property.getAnnotation(Sensitive.class);
if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
this.strategy = annotation.starategy();
return this;
}
return provider.findValueSerializer(property.getType(), property);
}
}

然后在需要脱敏的实体类字段上加上自定义注解
@ApiModelProperty(value = "电话")
@Sensitive(starategy = SensitiveStrategy.PHONE)
private String tel;

正则式根据自己业务需求进行更改