专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
ImportNew  ·  亚马逊程序员破防:AI ... ·  14 小时前  
ImportNew  ·  Redis 之父:哪怕被喷我也要说,AI ... ·  2 天前  
51好读  ›  专栏  ›  芋道源码

SpringBoot 采用 JsonSerializer 和 Aop 实现可控制的数据脱敏

芋道源码  · 公众号  · Java  · 2025-05-13 09:30

正文

请到「今天看啥」查看全文



PrivacyTypeEnum type () default PrivacyTypeEnum.CUSTOMER ;

/**
* 前置不需要打码的长度
*/

int prefixNoMaskLen () default 0 ;

/**
* 后置不需要打码的长度
*/

int suffixNoMaskLen () default 0 ;

/**
* 用什么打码
*/

String maskStr () default "*" ;

}

序列化类

public class PrivacySerialize extends JsonSerializer<Stringimplements ContextualSerializer {
   publicstaticfinal Logger logger = LoggerFactory.getLogger(PrivacySerialize.class);
   private PrivacyTypeEnum type;

   private Integer prefixNoMaskLen;

   private Integer suffixNoMaskLen;

   private String maskStr;

   public PrivacySerialize(PrivacyTypeEnum type, Integer prefixNoMaskLen, Integer suffixNoMaskLen, String maskStr) {
      this.type = type;
      this.prefixNoMaskLen = prefixNoMaskLen;
      this.suffixNoMaskLen = suffixNoMaskLen;
      this.maskStr = maskStr;
   }
   public PrivacySerialize() {
   }

   @Override
   public void serialize(String origin,JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException {
      if (StringUtils.isNotBlank(origin) && null != type) {
         switch (type) {
            case CHINESE_NAME:
               jsonGenerator.writeString(DesensitizedUtils.chineseName(origin));
               break;
            case ID_CARD:
               jsonGenerator.writeString(DesensitizedUtils.idCardNum(origin));
               break;
            case FIXED_PHONE:
               jsonGenerator.writeString(DesensitizedUtils.fixedPhone(origin));
               break;
            case MOBILE_PHONE:
               jsonGenerator.writeString(DesensitizedUtils.mobilePhone(origin));
               break;
            case ADDRESS:
               jsonGenerator.writeString(DesensitizedUtils.address(origin));
               break;
            case EMAIL:
               jsonGenerator.writeString(DesensitizedUtils.email(origin));
               break;
            case BANK_CARD:
               jsonGenerator.writeString(DesensitizedUtils.bankCard(origin));
               break;
            case PASSWORD:
               jsonGenerator.writeString(DesensitizedUtils.password(origin));
               break;
            case KEY:
               jsonGenerator.writeString(DesensitizedUtils.key(origin));
               break;
            case CUSTOMER:
               jsonGenerator.writeString(DesensitizedUtils.desValue(origin, prefixNoMaskLen, suffixNoMaskLen, maskStr));
               break;
            default:
               thrownew IllegalArgumentException("Unknow sensitive type enum " + type);
         }
      }else {
         jsonGenerator.writeString("");
      }

   }

   @Override
   public JsonSerializer> createContextual(SerializerProvider serializerProvider,BeanProperty beanProperty) throws JsonMappingException {
      if (beanProperty != null) {
            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {
               PrivacyEncrypt encrypt = beanProperty.getAnnotation(PrivacyEncrypt.class);
               if (encrypt == null) {
                  encrypt = beanProperty.getContextAnnotation(PrivacyEncrypt.class);
               }
               if (encrypt != null) {
                  returnnew PrivacySerialize(encrypt.type(), encrypt.prefixNoMaskLen(),
                        encrypt.suffixNoMaskLen(), encrypt.maskStr());
               }
            }
         return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);
      }
      return serializerProvider.findNullValueSerializer(null);
   }
}

脱敏工具类

/**
 * 脱敏工具类
 *
 **/

publicclass DesensitizedUtils {

   /**
    * 对字符串进行脱敏操作
    * @param origin 原始字符串
    * @param prefixNoMaskLen 左侧需要保留几位明文字段
    * @param suffixNoMaskLen 右侧需要保留几位明文字段
    * @param maskStr 用于遮罩的字符串, 如'*'
    * @return 脱敏后结果
    */

   public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) {
      if (origin == null) {
         returnnull;
      }

      StringBuilder sb = new StringBuilder();
      for (int i = 0, n = origin.length(); i < n; i++) {
         if (i < prefixNoMaskLen) {
            sb.append(origin.charAt(i));
            continue;
         }
         if (i > (n - suffixNoMaskLen - 1)) {
            sb.append(origin.charAt(i));
            continue;
         }
         sb.append(maskStr);
      }
      return sb.toString();
   }

   /**
    * 【中文姓名】只显示最后一个汉字,其他隐藏为星号,比如:**梦
    * @param fullName 姓名
    * @return 结果
    */

   public static String chineseName(String fullName) {
      if (fullName == null) {
         returnnull;
      }
      return desValue(fullName, 01"*");
   }

   /**
    * 【身份证号】显示前六位, 四位,其他隐藏。共计18位或者15位,比如:340304*******1234
    * @param id 身份证号码
    * @return 结果
    */

   public 






请到「今天看啥」查看全文