Java数据脱敏核心是识别敏感字段、定义规则、适时替换;支持手机号、身份证、姓名、银行卡、邮箱等类型注解标记,通过反射工具类自动处理,并借助ResponseBodyAdvice实现Spring MVC响应前统一脱敏。

Java中实现数据脱敏,核心是**识别敏感字段 + 定义脱敏规则 + 在合适时机执行替换**,不依赖第三方框架也能快速落地。
明确常见敏感字段类型和脱敏方式
不同字段适用不同脱敏策略,需按业务安全等级选择:
- 手机号:保留前3位和后4位,中间用*代替(如 138****1234)
- 身份证号:保留前6位和后4位,中间掩码(如 110101****1234)
- 姓名:只显示姓氏,名用*替代(如 张*);多人名可统一处理为“某先生/某女士”
- 银行卡号:保留后4位,其余用*填充(如 **** **** **** 5678)
- 邮箱:保留@前首字符和域名部分(如 z***@example.com)
在实体类中声明脱敏标记(轻量级注解方案)
自定义一个 @Desensitize 注解,标注需要脱敏的字段,并指定脱敏类型:
@Target({FIELD})
@Retention(RUNTIME)
public @interface Desensitize {
DesensitizeType value() default DesensitizeType.DEFAULT;
}再定义枚举 DesensitizeType 包含 PHONE、ID_CARD、NAME、EMAIL 等值。这样既清晰又便于后续统一处理。
立即学习“Java免费学习笔记(深入)”;
通过反射 + 注解实现实体自动脱敏
写一个工具类 DesensitizeUtil,遍历对象所有字段,检查是否含 @Desensitize 注解,根据类型调用对应脱敏方法:
- 使用 Field.setAccessible(true) 访问私有字段
- 对字符串类型字段做掩码替换,非字符串跳过
- 支持嵌套对象(递归处理)和集合(遍历每个元素)
- 脱敏逻辑集中管理,新增类型只需扩展枚举和 switch 分支
结合Spring MVC在响应前统一脱敏
利用 ResponseBodyAdvice 接口,在 Controller 返回响应体之前拦截并脱敏:
@ControllerAdvice public class DesensitizeResponseAdvice implements ResponseBodyAdvice
这样所有返回 JSON 的接口自动生效,无需每个 Controller 手动调用,也避免脱敏逻辑散落在业务代码中。










