枚举
@AllArgsConstructor
public enum SensitiveStrategy {
ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)),
PHONE(DesensitizedUtil::mobilePhone),
ADDRESS(s -> DesensitizedUtil.address(s, 8)),
EMAIL(DesensitizedUtil::email),
BANK_CARD(DesensitizedUtil::bankCard);
private final Function<String, String> desensitizer;
public Function<String, String> desensitizer() {
return desensitizer;
}
}
自定义JsonSerializer序列化
@Slf4j
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
private SensitiveStrategy strategy;
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
try {
gen.writeString(strategy.desensitizer().apply(value));
} catch (BeansException e) {
log.error("脱敏实现不存在, 采用默认处理 => {}", e.getMessage());
gen.writeString(value);
}
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
Sensitive annotation = property.getAnnotation(Sensitive.class);
if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
this.strategy = annotation.strategy();
return this;
}
return prov.findValueSerializer(property.getType(), property);
}
}
自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
SensitiveStrategy strategy();
}
测试
public class TestSensitiveController extends BaseController {
@GetMapping("/test")
public R<TestSensitive> test() {
TestSensitive testSensitive = new TestSensitive();
testSensitive.setIdCard("210397198608215431");
testSensitive.setPhone("17640125371");
testSensitive.setAddress("北京市朝阳区某某四合院1203室");
testSensitive.setEmail("17640125371@163.com");
testSensitive.setBankCard("6226456952351452853");
return R.ok(testSensitive);
}
public static void main(String[] args) throws JsonProcessingException {
TestSensitive testSensitive = new TestSensitive();
testSensitive.setIdCard("371523199811216292");
testSensitive.setPhone("17640125371");
testSensitive.setAddress("北京市朝阳区某某四合院1203室");
testSensitive.setEmail("17640125371@163.com");
testSensitive.setBankCard("6226456952351452853");
JsonMapper jsonMapper = new JsonMapper();
System.err.println(jsonMapper.writeValueAsString(testSensitive));
}
@Data
static class TestSensitive {
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String idCard;
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phone;
@Sensitive(strategy = SensitiveStrategy.ADDRESS)
private String address;
@Sensitive(strategy = SensitiveStrategy.EMAIL)
private String email;
@Sensitive(strategy = SensitiveStrategy.BANK_CARD)
private String bankCard;
}
}