枚举类、@JsonSerialize实现数据脱敏

数据脱敏

hutool

hutool包的DesensitizedUtil

序列化注解,指定序列化器@JsonSerialize

@JacksonAnnotationsInside:jackson元注解,用于指示Jackson应该使用它所拥有的元注解,在创建“组合注解”时非常有用。

@JsonSerialize:指定序列化器,可通过继承JsonSerializer.class以及继承ContextualSerializer接口自定义序列化策略

ContextualSerializer:根据文档注释,可得知该接口可为SensitiveJsonSerializer的扩展,可创建序列化的上下文(SensitiveJsonSerializer)

SensitiveJsonSerializer:抽象类,继承该类重写方法,即可实现属性的自定义序列化

/**
 * 使用该注解的属性,可配置自定义脱敏序列化规则
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
    // 脱敏策略
    SensitiveStrategy strategy();
}
/**
 * 脱敏策略,枚举类,针对不同的数据定制特定的策略
 */
public enum SensitiveStrategy {
    
     /**
      * 用户名
      */
	USERNAME(s ->s.replaceAll("(\\S)\\S(\\S*)", "$1*$2")),
    /**
     * 身份证
     */
	ID_CARD(s->s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2"));
    
    private final Function<String, String> desensitizer;

	SensitiveStrategy(Function<String, String> desensitizer){
	    this.desensitizer = desensitizer;
    }

    public Function<String, String> desensitizer() {
        return desensitizer;
    }
}
/**
 * ContextualSerializer
 * JsonSerializers可以实现的附加接口,以获取回调,该回调可用于创建序列化程序的上下文实例,
 * 以用于处理受支持类型的值。这对于可以由注释配置的序列化程序可能很有用,
 * 或者应该根据正在序列化的属性类型而具有不同的行为。
 * 
 * JsonSerializer
 * 继承该抽象类,重写serialize方法,可自定义属性值序列化
 * 
 */
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {

    private SensitiveStrategy strategy;

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(strategy.desensitizer().apply(value));
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        Sensitive annotation = property.getAnnotation(Sensitive.class);
        if (ObjectUtil.isNotNull(annotation) && Objects.equals(String.class,property.getClass())){
            this.strategy = annotation.strategy();
            return this;
        }
        return new ToStringSerializer();
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值