【后端】处理手机号脱敏

 

  1.  mobilenumber = mobilenumber.substring(0, 3) + "***"

                           + mobilenumber.substring(length - 4, length);

  2. @Desensitization(desensitization=DesensitizationEnum.MOBILE_PHONE)

    private String mobilenumber;

  3. ResponseVO> responseVO = custInfoService.selectCustInfoList(formMap);

            LOGGER.info("条件查询客户列表查询结果:" + responseVO.getResult());

            List custInfolist = responseVO.getData();

            custInfolist = DesensitizationUtils.desensitizationList(custInfolist);

 

 

/**

 * 脱敏工具

 */

public class DesensitizationUtils {

    private static final Logger LOGGER = LoggerFactory.getLogger(DesensitizationUtils.class);

    /**

     * 脱敏

     * @param objList

     * @return

     */

    public static List desensitizationList(List objList) {

        List dobjList = new ArrayList();

        for (T obj : objList) {

            dobjList.add(desensitization(obj));

        }

        return dobjList;

    }

    /**

     * 脱敏

     * @param obj

     * @return

     */

    public static T desensitization(T obj) {

        try {

            Classextends Object> clazz = obj.getClass();

            //获取所有自己声明的属性 

            Field[] fields = clazz.getDeclaredFields();

            //遍历属性 

            for (Field field : fields) {

                //通过注解中的值来获取属性名(注解中的值应该与属性名相等) 

                Desensitization columnField = field.getAnnotation(Desensitization.class);

                //如果是没有注解的属性忽略掉

                if (null == columnField) {

                    continue;

                }

                String type = field.getGenericType().toString(); //获取属性的类型 

                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);

                Method rM = pd.getReadMethod();//获得读方法   

                Object oldValue = (Object) rM.invoke(obj);

                Object newValue = oldValue;

                if (null != oldValue) {

                    Method wM = pd.getWriteMethod();//获得写方法   

                    DesensitizationEnum desensitizationValue = columnField.desensitization();

                    String doMethodName = "do"

                                          + desensitizationValue.toString().replace("_", "")

                                              .substring(0, 1).toUpperCase()

                                          + desensitizationValue.toString().replace("_", "")

                                              .toLowerCase().substring(1);

                    Method getMethod = DesensitizationUtils.class.getDeclaredMethod(doMethodName,

                        String.class, Object.class);

                    newValue = getMethod.invoke(DesensitizationUtils.class, type, oldValue);

                    wM.invoke(obj, newValue);

                }

            }

        } catch (Exception e) {

            LOGGER.error("脱敏处理失败{}", e);

        }

        return obj;

    }

    /**

     * [中文姓名] 只显示第一个汉字,其他隐藏为星号<例子:李**>

     */

    public static Object doChinesename(String type, Object oldValue) {

        //判断字符串,多个中满足任何一个用IN,并使用'' 

        if (!type.equals("class java.lang.String")) {

            LOGGER.info("不支持的数据类型{}", type);

            throw new RuntimeException("不支持的数据类型");

        }

        //字符串表示法 

        String fullName = oldValue.toString();

        String name = StringUtils.left(fullName, 1);

        return StringUtils.rightPad(name, fullName.length(), "*");

    }

    /**

     * [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>

     * @return

     */

    public static Object doIdcard(String type, Object oldValue) {

        //判断字符串,多个中满足任何一个用IN,并使用'' 

        if (!type.equals("class java.lang.String")) {

            LOGGER.info("不支持的数据类型{}", type);

            throw new RuntimeException("不支持的数据类型");

        }

        //字符串表示法 

        String id = oldValue.toString();

        int length = id.length();

        if (length <= 4) {

            return id;

        }

        String num = StringUtils.right(id, 4);

        return StringUtils.leftPad(num, id.length(), "*");

    }

    /**

     * [固定电话] 后四位,其他隐藏<例子:****1234>

     */

    public static Object doFixedphone(String type, Object oldValue) {

        //判断字符串,多个中满足任何一个用IN,并使用'' 

        if (!type.equals("class java.lang.String")) {

            LOGGER.info("不支持的数据类型{}", type);

            throw new RuntimeException("不支持的数据类型");

        }

        //字符串表示法 

        String num = oldValue.toString();

        int length = num.length();

        if (length <= 4) {

            return num;

        }

        return StringUtils.leftPad(StringUtils.right(num, 4), num.length(), "*");

    }

    /**

     * [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>

     * 

     * @return

     */

    public static Object doMobilephone(String type, Object oldValue) {

        //判断字符串,多个中满足任何一个用IN,并使用'' 

        if (!type.equals("class java.lang.String")) {

            LOGGER.info("不支持的数据类型{}", type);

            throw new RuntimeException("不支持的数据类型");

        }

        //字符串表示法 

        String mobilnumber = oldValue.toString();

        int length = mobilnumber.length();

        if (length <= 7) {

            return mobilnumber;

        }

        return StringUtils.left(mobilnumber, 3).concat(

            StringUtils.removeStart(

                StringUtils.leftPad(StringUtils.right(mobilnumber, 4), mobilnumber.length(), "*"),

                "***"));

    }

    /**

     * [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>

     */

    public static Object doAddress(String type, Object oldValue) {

        //判断字符串,多个中满足任何一个用IN,并使用'' 

        if (!type.equals("class java.lang.String")) {

            LOGGER.info("不支持的数据类型{}", type);

            throw new RuntimeException("不支持的数据类型");

        }

        //字符串表示法 

        String address = oldValue.toString();

        int length = address.length();

        if (length <= 2) {

            return address;

        }

        return StringUtils.rightPad(StringUtils.left(address, length / 2), length, "*");

    }

    /**

     * [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com> 

     */

    public static Object doEmail(String type, Object oldValue) {

        //判断字符串,多个中满足任何一个用IN,并使用'' 

        if (!type.equals("class java.lang.String")) {

            LOGGER.info("不支持的数据类型{}", type);

            throw new RuntimeException("不支持的数据类型");

        }

        //字符串表示法 

        String email = oldValue.toString();

        int index = StringUtils.indexOf(email, "@");

        if (index <= 1) {

            return email;

        }

        return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(

            StringUtils.mid(email, index, email.length()));

    }

    /**

     * [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>

     */

    public static Object doBankcard(String type, Object oldValue) {

        //判断字符串,多个中满足任何一个用IN,并使用'' 

        if (!type.equals("class java.lang.String")) {

            LOGGER.info("不支持的数据类型{}", type);

            throw new RuntimeException("不支持的数据类型");

        }

        //字符串表示法 

        String cardNum = oldValue.toString();

        int length = cardNum.length();

        if (length <= 10) {

            return cardNum;

        }

        return StringUtils.left(cardNum, 6).concat(

            StringUtils.removeStart(

                StringUtils.leftPad(StringUtils.right(cardNum, 4), length, "*"), "******"));

    }

}

你可能感兴趣的:(Java)