在 Spring Boot 结合 MyBatis 的项目中,实现字段脱敏(如手机号、身份证号、银行卡号等敏感信息的部分隐藏)可以通过以下方案实现。以下是分步说明和完整代码示例:
一、实现方案选择
1. 方案一:自定义注解 + Jackson 序列化脱敏
- 适用场景:数据返回给前端时动态脱敏,数据库存储原始数据。
- 优点:无侵入性,通过注解灵活控制脱敏字段,与业务逻辑解耦。
- 核心实现:利用 Jackson 的
JsonSerializer
自定义序列化逻辑。
2. 方案二:MyBatis 类型处理器(TypeHandler)
- 适用场景:数据库存储时加密或脱敏,查询时解密。
- 优点:数据存储层直接处理,安全性高。
- 缺点:需处理加解密逻辑,可能影响查询性能。
3. 方案三:AOP 拦截 Service 层返回结果
- 适用场景:在业务层统一处理敏感字段。
- 优点:集中控制脱敏逻辑。
- 缺点:需遍历对象树,性能开销较大。
二、推荐方案一:Jackson 动态脱敏(完整代码)
1. 定义脱敏策略注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Sensitive {
/**
* 脱敏策略类型
*/
SensitiveStrategy strategy();
}
2. 定义脱敏策略枚举
public enum SensitiveStrategy {
/**
* 手机号脱敏(保留前3后4位)
*/
PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
/**
* 身份证脱敏(保留前1后4位)
*/
ID_CARD(s -> s.replaceAll("(\\d{1})\\d{13}(\\d{4})", "$1*************$2")),
/**
* 银行卡脱敏(保留前6后4位)
*/
BANK_CARD(s -> s.replaceAll("(\\d{6})\\d{9}(\\d{4})", "$1*********$2"));
private final Function