Springboot 手机号脱敏简单解决方案

废话不多说 直接上代码

1、定义脱敏使用的注解

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author 米斯特_杨
 * @date 2023/12/12 17:00
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveSerializable.class )
public @interface Sensitive {
    SensitiveEnum strategy();
}

2、定义策略的枚举类 (此处为电话号码脱密,后续可以继续追加其他信息的脱敏枚举,规则取决于业务需求)


import java.util.function.Function;

/**
 * @author 米斯特_杨
 * @date 2023/12/12 17:07
 */
public enum SensitiveEnum {

    MOBILE(s-> s.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"));

    Function<String,String > deSensitive;

    SensitiveEnum(Function<String,String > deSensitive){
        this.deSensitive = deSensitive;
    }

    public Function<String,String> getDeSensitive(){
        return deSensitive;
    }

}

3、自定义注解(@Sensitive)中的注解 @JsonSerialize(using = SensitiveSerializable.class )对象进行序列话时候执行的自定义的规则类,可以在该类中实现所需的逻辑。

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import org.springframework.util.ObjectUtils;

import java.io.IOException;

/**
 * @author 米斯特_杨
 * @date 2023/12/12 17:04
 */
public class SensitiveSerializable extends JsonSerializer<String> implements ContextualSerializer {

    private SensitiveEnum sensitiveEnum;

    @Override
    public void serialize(String value, JsonGenerator generator, SerializerProvider serializerProvider) throws IOException {
        generator.writeString(sensitiveEnum.getDeSensitive().apply(value));
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty property) throws JsonMappingException {
        Sensitive annotation = property.getAnnotation(Sensitive.class);
        if (!ObjectUtils.isEmpty(annotation) && String.class == property.getType().getTypeName().getClass()) {
            this.sensitiveEnum = annotation.strategy();
            return this;
        }
        return serializerProvider.findValueSerializer(property.getType(), property);
    }
}

4、如何使用 将注解标到需要脱敏的字段上即可(strategy 策略选择 枚举中电话脱敏策略即可)

import com.example.ypp_redis_try.service.SensitiveEnum;
import com.example.ypp_redis_try.service.Sensitive;
import lombok.Data;

/**
 * @author 米斯特_杨
 * @date 2023/12/12 17:23
 */

@Data
public class UserVO {

    private String name;

    @Sensitive(strategy = SensitiveEnum.MOBILE)
    private String mobile;

}

5、脱敏结果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值