Json脱敏

前言

博主github
博主个人博客http://blog.healerjean.com

这里有两种脱敏方式,一种是注解脱敏,另一种是字段名匹配脱敏

1、注解脱敏

1.1、注解
/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName SensitiveInfo
 * @date 2019/6/13  20:01.
 * @Description Json序列化脱敏注解
 * 不建议使用注解,建议使用JsonUtils工具类进行脱敏,因为注解会让我们需要必要时输出到前台的信息变的脱敏
 */

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveInfoSerialize.class)
public @interface SensitiveInfo {
   

    SensitiveTypeEnum value() ;

}
1.2、脱敏的类型枚举
package com.hlj.proj.utils.sensitivity;



/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName SensitiveTypeEnum
 * @date 2019/6/13  20:01.
 * @Description 敏感信息枚举类型
 */
public enum SensitiveTypeEnum {
   


    /**
     * 身份证号
     */
    ID_CARD,
    /**
     * 密码
     */
    PASSWORD,
    /**
     * 手机号
     */
    MOBILE_PHONE,
    /**
     * 电子邮件
     */
    EMAIL,
    /**
     * 真实姓名
     */
    NAME,
    /**
     * 账户信息
     */
    ACCOUNT_NO;



}

1.3、Json脱敏序列化
package com.hlj.proj.utils.sensitivity;

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 java.io.IOException;
import java.util.Objects;

/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName SensitiveInfoSerialize
 * @date 2019/6/13  20:01.
 * @Description Json脱敏序列化
 */
public class SensitiveInfoSerialize extends JsonSerializer<Object> implements ContextualSerializer {
   

    private SensitiveTypeEnum type;

    public SensitiveInfoSerialize() {
   
    }

    public SensitiveInfoSerialize(final SensitiveTypeEnum type) {
   
        this.type = type;
    }


    @Override
    public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException {
   
        switch (this.type) {
   
            case ID_CARD: {
   
                jsonGenerator.writeString(SensitiveInfoUtils.idCard(String.valueOf(value)));
                break;
            }
            case MOBILE_PHONE: {
   
                jsonGenerator.writeString(SensitiveInfoUtils.mobilePhone(String.valueOf(value)));
                break;
            }
            case EMAIL: {
   
                jsonGenerator.writeString(SensitiveInfoUtils.email(String.valueOf(value)));
                break;
            }
            case ACCOUNT_NO: {
   
                jsonGenerator.writeString(SensitiveInfoUtils.acctNo(String.valueOf(value)));
                break;
            }
            case PASSWORD: {
   
                jsonGenerator.writeString(SensitiveInfoUtils.password(String.valueOf(value)));
                break;
            }
            case NAME: {
   
                jsonGenerator.writeString(SensitiveInfoUtils.realName(String.valueOf(value)));
                break;
            }
            default:
                jsonGenerator.writeString(String.valueOf(value));

        }

    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
   

        if (beanProperty != null) {
   

            // 非 String 类直接跳过
            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
   
                SensitiveInfo sensitiveInfo = beanProperty.getAnnotation(SensitiveInfo.class);
                if (sensitiveInfo == null) {
   
                    sensitiveInfo = beanProperty.getContextAnnotation(SensitiveInfo.class);
                }
                // 如果能得到注解,就将注解的 value 传入 SensitiveInfoSerialize
                if (sensitiveInfo != null) {
   

                    return new SensitiveInfoSerialize(sensitiveInfo.value());
                }
            }
            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
        }
        return serializerProvider.findNullValueSerializer(beanProperty);

    }
}

1.4、脱敏工具类
package com.hlj.proj.utils.sensitivity;

import org.apache.commons.lang3.StringUtils;


/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName SensitiveInfoUtils
 * @date 2019/6/13  20:01.
 * @Description 脱敏工具类
 */
public class SensitiveInfoUtils {
   

    /**
     * [真实姓名] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
     */
    public static String realName(final String realName) {
   
        if (StringUtils.
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
fastjson 是一个 Java 序列化/反序列化库,可以将 Java 对象转换为 JSON 格式的字符串,也可以将 JSON 格式的字符串转换为 Java 对象。在使用 fastjson 进行序列化时,有时需要对敏感信息进行脱敏处理,以保护用户隐私。fastjson 提供了多种脱敏方式,例如使用自定义序列化器、使用 JSONField 注解等。 使用自定义序列化器进行脱敏的示例代码如下: ```java public class User { private String name; private String idCard; // getter 和 setter 方法 public static class IdCardSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { String idCard = (String) object; if (idCard != null && idCard.length() > 8) { idCard = idCard.substring(0, 4) + "**********" + idCard.substring(idCard.length() - 4); } serializer.write(idCard); } } } ``` 在上面的代码中,我们定义了一个 User 类,其中包含了用户的姓名和身份证号码。为了对身份证号码进行脱敏处理,我们实现了一个 IdCardSerializer 类,该类实现了 fastjson 的 ObjectSerializer 接口,并重写了 write 方法。在 write 方法中,我们对身份证号码进行了脱敏处理,并调用了 serializer.write 方法将处理后的结果写入 JSON 字符串中。 使用 JSONField 注解进行脱敏的示例代码如下: ```java public class User { private String name; @JSONField(serializeUsing = IdCardSerializer.class) private String idCard; // getter 和 setter 方法 public static class IdCardSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { String idCard = (String) object; if (idCard != null && idCard.length() > 8) { idCard = idCard.substring(0, 4) + "**********" + idCard.substring(idCard.length() - 4); } serializer.write(idCard); } } } ``` 在上面的代码中,我们在 idCard 字段上使用了 JSONField 注解,并指定了 serializeUsing 属性为 IdCardSerializer.class。这样,在序列化时,fastjson 将会使用 IdCardSerializer 类对 idCard 字段进行序列化,并对身份证号码进行脱敏处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值