Spring Boot 全局数据脱敏推荐基于 Jackson 序列化层+外部配置实现,通过自定义 JsonSerializer 和 ResponseBodyAdvice 统一拦截响应,支持 YAML 规则配置、正则匹配、热刷新及标准/自定义脱敏算法。

在 Spring Boot 中实现全局数据脱敏输出,核心是**不改业务代码、不侵入实体类、规则可动态调整**。当前主流且推荐的做法是:基于 Jackson 序列化层 + 外部配置(如 YAML 文件或 Nacos)统一管控脱敏逻辑,而非硬编码注解或 AOP 切面。
用 Jackson 自定义序列化器接管所有 String 字段
让所有响应 JSON 中的字符串字段,在序列化时自动判断是否需脱敏:
- 继承 JsonSerializer<String> 和 ContextualSerializer 接口
- 在
createContextual方法中解析字段路径(如user.phone、order.payInfo.cardNo) - 根据预加载的脱敏规则映射表(Map<String, SensitiveType>),匹配当前字段路径
- 匹配成功则调用对应脱敏算法(如手机号掩码为
138****5678),否则原值输出
把脱敏规则写进 YAML 配置文件
避免散落在代码里,用 desensitize-rules.yml 统一管理:
rules:
- field: "user.phone"
type: "PHONE"
- field: "user.idCard"
type: "ID_CARD"
- field: "order.payment.cardNumber"
type: "BANK_CARD"
- field: ".*\.email$" # 支持正则匹配
type: "EMAIL"- 启动时读取该 YAML,构建字段路径到脱敏类型的映射
- 支持通配符和正则,适配嵌套对象、List、Map 等复杂结构
- 后续只需改配置,无需重启服务(配合 Spring Boot Config 或 Nacos 可热刷新)
统一拦截响应体,只做一次序列化干预
不依赖每个 Controller 返回类型,而是通过 Spring MVC 的 ResponseBodyAdvice 全局介入:
立即学习“Java免费学习笔记(深入)”;
- 实现
ResponseBodyAdvice<Object>,重写beforeBodyWrite - 对返回对象做浅拷贝或反射遍历,仅处理其 JSON 序列化前的原始结构
- 将脱敏逻辑下沉到序列化器中执行,保持性能稳定(避免 AOP 全量 JSON 解析)
- 与 Jackson 的
@JsonSerialize注解机制兼容,已有注解方案可平滑过渡
支持常见敏感类型的标准脱敏算法
内置可扩展的脱敏策略,开箱即用:
-
PHONE:保留前3位+后4位,中间掩码 →
138****5678 -
ID_CARD:保留前6位+后4位 →
110105****1234 -
BANK_CARD:保留前6位+后4位 →
622848****1234 -
EMAIL:保留用户名首尾字符 →
z***@example.com - 支持自定义函数:传入 lambda 或 SPI 扩展接口,对接企业内部加密/哈希规范


















