首页 > 其他分享 >Jackson序列化为字符串时对指定字段脱敏

Jackson序列化为字符串时对指定字段脱敏

时间:2024-05-30 14:33:33浏览次数:20  
标签:Jackson String text strategy substring length 序列化 public 脱敏

枚举脱敏字段类型及规则

import java.util.function.Function;

public enum TextMaskStrategy {

    ID_NO("身份证", 18, text -> "*".repeat(text.length() - 4) + text.substring(text.length() - 4)),

    PHONE("手机号", 11, text -> text.substring(0, 3) + "*".repeat(text.length() - 7) + text.substring(text.length() - 4)),

    BANK_CARD_NO("银行卡号", 10, text -> "*".repeat(text.length() - 8) + text.substring(text.length() - 4)),

    ADDRESS("地址", 8, text -> text.substring(0, 5) + "*".repeat(text.length() - 8) + text.substring(text.length() - 3)),

    CAR_NO("车牌号", 6, text -> text.substring(0, 2) + "*".repeat(text.length() - 3) + text.substring(text.length() - 1));

    private final String textType;

    private final int minLength;
    private final Function<String, String> maskFunction;

    TextMaskStrategy(String textType, int minLength, Function<String, String> maskFunction) {
        this.textType = textType;
        this.minLength = minLength;
        this.maskFunction = maskFunction;
    }

    public String getTextType() {
        return textType;
    }

    public int getMinLength() {
        return minLength;
    }

    public Function<String, String> getMaskFunction() {
        return maskFunction;
    }
}

注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = TextMaskJsonSerializer.class)
public @interface TextMask {

    TextMaskStrategy strategy();

}

序列化器

public class TextMaskJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {

    private TextMaskStrategy strategy;

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value != null && value.length() >= strategy.getMinLength()) {
            gen.writeString(strategy.getMaskFunction().apply(value));
        } else {
            gen.writeString(value);
        }
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        TextMask annotation = property.getAnnotation(TextMask.class);
        if (Objects.nonNull(annotation)
                && Objects.equals(String.class, property.getType().getRawClass())) {
            this.strategy = annotation.strategy();
            return this;
        }
        return prov.findValueSerializer(property.getType(), property);
    }
}

使用

在需在脱敏的字段上加上注解并指定脱敏策略

    @TextMask(strategy = TextMaskStrategy.BANK_CARD_NO)
    private String bankCardNo;

标签:Jackson,String,text,strategy,substring,length,序列化,public,脱敏
From: https://www.cnblogs.com/jiayuan2006/p/18222263

相关文章

  • (附nuclei yaml文件)泛微E-office 10 atuh-filephar反序列化命令执行漏洞复现(QVD-2024-1
    (附nucleiyaml文件)泛微E-office10atuh-filephar反序列化命令执行漏洞复现(QVD-2024-11354)声明本文仅用于技术交流,请勿用于非法用途由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。1、漏洞简介泛......
  • Newtonsoft.Json 序列化器的重写
    //TGD_AUDIT_STATUS、TGD_DEPT_ID都是Int32?的数据类型,如果他们的值包含小数点时直接反序列化会报错的,异常是:字符串的格式不正确,所以此时可以进行客户自定义反序列化的规则设定,这样就问题解决了。自定义实现类中,反序列化时调用ReadJson方法,序列化时调用WriteJson方法。stringj......
  • 序列化与反序列化(GO)
    GO序列化与反序列化定义序列化:把对象转化为可传输的字节序列的过程称为序列化反序列化:把字节序列还原为对象的过程称为反序列化。--作为开发者,序列化和反序列化一直是我们老生常谈的问题,也是非常琐碎但是重要的知识点。对于序列化与反序列化,我这里强烈推荐一篇博客,你可以从中......
  • .NET8序列化与反序列化
    序列化与反序列化JSON简介JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,采用类的形式来描述数据之间的关联关系。JSON是一个序列化的对象或数组。JSON中仅有六个构造字符([、]、{、}、:、,),以及无意义的空白符(换行、空间等)JSON中的数据类型:对象(使用{})、数组(使用[])、......
  • Weblogic T3协议反序列化漏洞[CVE-2018-2628]
    漏洞复现环境搭建请参考http://t.csdnimg.cn/TYtKgkali切换jdk版本请参考Kali安装JAVA8和切换JDK版本的详细过程_kali安装jdk8-CSDN博客漏洞原理T3协议实现Weblogicserver和其他java程序间的数据传输,Weblogic开放7001端口则默认开启T3服务,通过构造恶意的T3协议数据,利用......
  • C# xml文档反序列化记事
    可以使用XmlSerializer直接序列化和反序列化xml反序列化如以下代码privateT?XmlDeseriallize<T>(stringfilePath){XmlSerializerserializer=newXmlSerializer(typeof(T));using(FileStreamfileStream=newFileStream(f......
  • 关于对于Java中Entity以及VO,以及DTO中Request对象序列化的学习
    关于Serializable的探讨前提引入是由于软件测试上有同学提到说,什么该字段在程序刚运行时,导致jvm激增,所以吸引了我的注意回顾代码MybatisPlusGenerator自动生成的entity中就经常带有这个,而且我在开发代码的时候VO,以及DTO常常是直接复制对应的entity,所以也保不齐我对应......
  • @JsonFormat注解出现日期序列化以及反序列化问题(日期比实际日期少一天)
    文章目录前言一、场景如下所示二、问题分析三、@JsonFormat注解是什么以下是@JsonFormat注解的一些常用属性:四、解决问题解决方式:只需要指定对应的时区就好效果如下:五、@JsonFormat注解时出现日期问题总结前言  在一次的偶然机会下发现了一个小问题,场景是这......
  • Golang 序列化与反序列化,包含字段首字母小写和字段时间格式化
     golang结构体json的时间 序列化与反序列化 格式化解决方案 //最近开发项目时候发现一个结构体的Json转换的时间格式问题。//即这种1993-01-01T20:08:23.000000028+08:00这种表示UTC方法。//从我们习惯来说,更喜欢希望的是1993-01-0120:08:23这种格式如......
  • 类转词典 转json 序列化 魔术方法
      classTest:def__init__(self,totals,uniques,pre):self.totals=totalsself.uniques=uniquesself.cumulative_sum=totalsifpre:self.cumulative_sum+=pre.cumulative_sumpre=Test(......