springboot 实现敏感信息脱敏
记录于2025年4月28号晚上--梧州少帅
1. 定义枚举类:
public enum DesensitizeType {NAME, EMAIL
}
2. 创建自定义注解:
用于标记需要脱敏的字段及其类型。
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizeSerializer.class)
public @interface Desensitize {DesensitizeType type();
}
3. 实现自定义序列化器:
根据注解类型应用不同的脱敏规则。
public class DesensitizeSerializer extends JsonSerializer<String> implements ContextualSerializer {private DesensitizeType type;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {switch (type) {case NAME:gen.writeString(desensitizeName(value));break;case EMAIL:gen.writeString(desensitizeEmail(value));break;default:gen.writeString(value);}}private String desensitizeName(String name) {if (name == null || name.isEmpty()) return "";if (name.length() == 1) return name;return name.charAt(0) + "*".repeat(Math.max(0, name.length() - 1));}private String desensitizeEmail(String email) {if (email == null || !email.contains("@")) return email;String[] parts = email.split("@");String local = parts[0];String domain = parts[1];if (local.length() <= 2) return "***@" + domain;return local.substring(0, 2) + "***@" + domain;}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {Desensitize annotation = property.getAnnotation(Desensitize.class);if (annotation != null) {DesensitizeSerializer serializer = new DesensitizeSerializer();serializer.type = annotation.type();return serializer;}return this;}
}
4. 在DTO中应用注解:
在需要脱敏的字段上添加@Desensitize注解。
public class UserDTO {@Desensitize(type = DesensitizeType.NAME)private String name;@Desensitize(type = DesensitizeType.EMAIL)private String email;// Getters and Setters
}
需要添加的依赖:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.5</version>
</dependency>
测试:
public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();UserDTO build = UserDTO.builder().name("黄成宇").email("huangchengyu1@byd.com").build();String json = objectMapper.writeValueAsString(build);System.out.println(json);}