Spring Boot 数据脱敏推荐用 Jackson 自定义序列化器 + @Sensitive 注解实现:注解标记字段并配置脱敏类型及规则,序列化器动态解析注解执行手机号、身份证、邮箱等脱敏,结合 Hutool 工具复用逻辑,自动生效于 JSON 响应,不侵入业务。

Spring Boot 项目实现数据脱敏输出,核心目标是在接口返回(JSON 序列化)阶段自动隐藏敏感字段,不侵入业务逻辑、不修改实体类使用方式,同时支持灵活配置。最常用且推荐的方式是基于 Jackson 自定义序列化器 + 注解,兼顾简洁性、可维护性和扩展性。
用 @Sensitive 注解标记字段
在实体类字段上加自定义注解,声明该字段需脱敏及脱敏类型:
- 定义注解
@Sensitive,含type()(如 PHONE、ID_CARD)、可选prefix/suffix(保留前/后几位)和mask(掩码字符) - 例如:
@Sensitive(type = SensitiveType.PHONE, prefix = 3, suffix = 4)标记手机号字段 - 注解仅作标记,不包含逻辑,保持轻量、无副作用
写一个 Jackson 序列化器处理脱敏
继承 JsonSerializer<string></string> 并实现 ContextualSerializer,让 Jackson 在序列化每个带注解的字段时动态绑定脱敏规则:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
createContextual方法提取字段上的@Sensitive参数,构造对应策略实例 -
serialize方法根据类型调用具体逻辑:手机号 → “138****1234”,身份证 → “110101****000000”,邮箱 → “u***@xxx.com” - 可复用 Hutool 的
DesensitizedUtil(如DesensitizedUtil.mobilePhone("13812345678")),避免重复造轮子
注册序列化器并生效
让 Jackson 识别你的注解和序列化器:
- 在注解定义中添加
@JsonSerialize(using = SensitiveInfoSerialize.class),或在字段上显式标注@JsonSerialize(using = SensitiveInfoSerialize.class) - 确保 Spring Boot 的
ObjectMapper扫描到该序列化器(通常默认生效;若自定义了 ObjectMapper,需手动注册模块) - Controller 返回对象时,只要字段被注解标记,响应 JSON 中就自动脱敏,无需任何额外代码
其他场景补充说明
脱敏不止在 API 响应中需要:
-
日志输出:用 Logback 的
MaskingPatternLayout或自定义Converter过滤日志中的手机号、身份证等,避免明文打日志 -
数据库读写:若需存储时加密、查询时自动解密+脱敏,可用 MyBatis
TypeHandler实现(适合强安全要求场景) -
前端兜底:后端脱敏是必须的,前端展示层可再加一层简单掩码(如用
v-mask),但不可依赖前端做唯一防护

















