java 邮箱 身份证 手机号脱敏

/**
 * 函数式接口
 */
@FunctionalInterface
public interface StringFunction {

    /**
     * 函数调用方法
     *
     * @param s
     * @return
     */
    String apply(String s);
}
public class MaskUtils {

    /**
     * 隐藏手机号
     *
     * @param mobile
     * @return
     */
    public static String maskMobile(String mobile) {
        if (StringUtils.isEmpty(mobile) || (mobile.length() != 11)) {
            return mobile;
        }
        return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    /**
     * 隐藏邮箱信息
     *
     * @param email
     * @return
     */
    public static String maskEmail(String email) {
        if (StringUtils.isEmpty(email)) {
            return email;
        }
        return email.replaceAll("(\\w+)\\w{3}@(\\w+)", "$1***@$2");
    }

    /**
     * 隐藏身份证号码
     *
     * @param id
     * @return
     */
    public static String maskIdCardNo(String id) {
        if (StringUtils.isEmpty(id) || (id.length() < 8)) {
            return id;
        }
        return id.replaceAll("(?<=\\w{6})\\w(?=\\w{6})", "*");
    }

    /**
     * 对实体列表脱敏
     *
     * @param datas
     * @param <T>
     * @return
     */
    @SuppressWarnings("uncheck")
    public static <T> List<T> maskList(List<T> datas) {
        datas.forEach(MaskUtils::maskObject);
        return datas;
    }

    /**
     * 对单实体脱敏
     *
     * @param data
     * @param <T>
     * @return
     */
    @SuppressWarnings("uncheck")
    public static <T> T maskObject(T data) {
        Class clazz = data.getClass();
        Stream.of(clazz.getDeclaredFields()).forEach(f -> {
            Mask mask = f.getAnnotation(Mask.class);
            if (mask != null) {
                String fName = f.getName();
                try {
                    String methodName = fName.substring(0, 1).toUpperCase() + fName.substring(1);
                    Method getMethod = clazz.getMethod("get" + methodName, null);
                    Method setMethod = clazz.getMethod("set" + methodName, String.class);
                    StringFunction sf = null;
                    if (mask.dataType() == Mask.DataType.MOBILE) {
                        sf = MaskUtils::maskMobile;
                    } else if (mask.dataType() == Mask.DataType.EMAIL) {
                        sf = MaskUtils::maskEmail;
                    } else if (mask.dataType() == Mask.DataType.ID_CARD) {
                        sf = MaskUtils::maskIdCardNo;
                    }
                    if (sf != null) {
                        setMethod.invoke(data, sf.apply(getMethod.invoke(data, null).toString()));
                    }
                } catch (Exception e) {

                }
            }
        });
        return data;
    }
}
import java.util.Arrays;
import java.util.List;

public class MaskUtilsTest {

    @Test
    public void testMaskStr() {
        System.out.println(MaskUtils.maskMobile("15574307649"));
        System.out.println(MaskUtils.maskIdCardNo("362201199009191811"));
        System.out.println(MaskUtils.maskEmail("coupman@sina.com"));
    }


    @Test
    public void testMaskList() {
        Data data = new Data();
        data = MaskUtils.maskObject(data);
        List<Data> dataList = MaskUtils.maskList(Arrays.asList(data));
        System.out.println(data.toString());
    }

    @lombok.Data
    public static class Data {
        @Mask(dataType = Mask.DataType.MOBILE)
        private String mobile = "15574307649";
        @Mask(dataType = Mask.DataType.EMAIL)
        private String email = "coupman@sina.com";
        @Mask(dataType = Mask.DataType.ID_CARD)
        private String idCard = "362201199009191811";
    }
}

 

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值