自定義註解實現日誌脫敏

第一步:定義註解工具

/**
 * 說明:自定義註解
 * @author T-xul3
 * @date  2016年9月9日 下午2:44:49
 */
@Target(value={ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SensitiveInfo {
    
    public SensitiveUtils.sensitiveType Type();
    
}測試

第二步:使用註解.net

/**
 * 說明:脫敏工具類
 * @author T-xul3
 * @date  2016年9月8日 下午5:44:17
 */
public  class SensitiveUtils {
    
    /**
     * 說明:脫敏枚舉類
     * @author T-xul3
     * @date  2016年9月8日 下午5:44:39
     */
    public enum sensitiveType {
        
        name,idCardNum,mobilePhone,bankCard,cnapsCode,fixedPhone,defaultType;code

    }
    
    /**
     * 說明:    用戶名:只顯示第一個,其餘隱藏爲星號<例子:李**>
     * @param ss
     * @return
     * 2016年9月8日 下午5:40:29
     */
    public static String name(String ss){
        if(StringUtils.isBlank(ss)){
            return "";
        }
        int length=StringUtils.length(ss);
        String newStr=StringUtils.left(ss, 1);
        return StringUtils.rightPad(newStr, length, "*");
        //return ss.replaceAll("(.)", "*");
    }
    
    /**
     * 說明:    默認所有字符串轉換爲* <例子:1234 ----》 **** >
     * @param strDefault 
     * @return
     * @author T-xul3
     * @date  2016年9月9日 下午2:36:55
     */
    public static String defaultType(String strDefault){
        return strDefault.replaceAll("(.)", "*");
        
    }
    /**
     * 說明:     身份證號碼:顯示最後四位,其餘隱藏。共計18位或者15位。<例子:*************5762>
     * @param id
     * @return
     * 2016年9月8日 下午5:39:27
     */
    public static String idCardNum(String id) {
        if (StringUtils.isBlank(id)) {
                return "";
          }
         String num = StringUtils.right(id, 4);
         return StringUtils.leftPad(num, StringUtils.length(id), "*");
        }
    
    /**
     * 說明:    [手機號碼] 前三位,後四位,其餘隱藏<例子:138******1234>
     * @param num 手機號碼
     * @return
     * @author T-xul3
     * @date  2016年9月8日 下午5:47:06
     */
    public static String mobilePhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
return StringUtils.left(num,3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num,4), StringUtils.length(num), "*"), "***"));
    }
    
    /**
     * 說明:    參數類型是Integer(長度值小於11位)
     * [固定電話] 後四位,其餘隱藏<例子:****1234>
     * @param num
     * @return
     * @author T-xul3
     * @date  2016年9月9日 上午10:35:23
     */
    public static String fixedPhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        int length=StringUtils.length(num);
        //從右邊截取制定長度的字符串
        String right = StringUtils.right(num, 4);
        //若是參數1長度小於參數2,那麼所有用*號替換
        return StringUtils.leftPad(right, length, "*");
    }對象

    /**
     * 說明:    [銀行卡號] 前六位,後四位,其餘用星號隱藏每位1個星號<例子:6222600**********1234>
     * @param cardNum 銀行卡號
     * @return
     * @author T-xul3
     * @date  2016年9月8日 下午5:48:26
     */
    public static String bankCard(String cardNum) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
    }
    
    /**
     * 說明:     [公司開戶銀行聯號] 公司開戶銀行聯行號,顯示前兩位,其餘用星號隱藏,每位1個星號<例子:12********>
     * @param code 公司開戶銀行聯號
     * @return
     * @author T-xul3
     * @date  2016年9月8日 下午5:50:10
     */
    public static String cnapsCode(String code) {
        if (StringUtils.isBlank(code)) {
            return "";
        }
        return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
    }rem

    
    /**
     * 說明:    獲取脫敏對象
     * @param object 
     * @return
     * @throws SecurityException 
     * @throws NoSuchFieldException 
     * @throws IllegalAccessException 
     * @throws IllegalArgumentException 
     * @throws Exception
     * 2016年9月8日 下午5:41:16
     */
    public static String getJavaBean(Object object) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException  {
        
        Class<? extends Object> clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        String str="";
            for (Field field : fields) {
                field.setAccessible(true);
                //獲取字段上的註解
                SensitiveInfo annotation = field.getAnnotation(SensitiveInfo.class);
                //獲取字段的屬性名稱
                String fieldName=field.getName();
                //獲取字段的值並轉換爲String類型
                String value = fieldType(object, field, fieldName);
                //判斷是否存在註解
                if(null!=annotation){
                //獲取註解的具體類型
                sensitiveType Type = annotation.Type();
                //匹配註解類型
                switch(Type){
                    case name:{
                        //替換爲*號,從新輸出
                        String valueStr = SensitiveUtils.name(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                    case idCardNum:{
                        //替換爲*號,從新輸出
                        String valueStr = SensitiveUtils.idCardNum(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                    case mobilePhone:{
                        //替換爲*號,從新輸出
                        String valueStr = SensitiveUtils.mobilePhone(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                    case fixedPhone:{
                        //替換爲*號,從新輸出
                        String valueStr = SensitiveUtils.fixedPhone(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                    default:{
                        String valueStr = SensitiveUtils.defaultType(value);
                        str+=fieldName+":"+valueStr+",";
                        break;
                    }
                }
            };
            if(null==annotation){
                str+=fieldName+":"+value+",";
            }
        }
        return str;
    }字符串

    private static String fieldType(Object object, Field field, String fieldName)
            throws NoSuchFieldException, IllegalAccessException {
        //獲取字段的類型
        Class<?> fieldClazz = field.getType();
        String value="";
        //經過屬性名獲取私有屬性字段的屬性值
        Field f1 = object.getClass().getDeclaredField(fieldName);
        f1.setAccessible(true);
        //判斷字段具體類型,最終將字段值所有轉換爲String類型。
        if(fieldClazz.equals(String.class)){
            value = (String) f1.get(object);
        }
        if(fieldClazz.equals(Integer.class)){
            Integer valueInteger = (Integer) f1.get(object);
            value=valueInteger.toString();
        }
        if(fieldClazz.equals(Long.class)){
            Long valueLong = (Long) f1.get(object);
            value=valueLong.toString();
        }
        if(fieldClazz.equals(int.class)){
            int valueLong = (int) f1.get(object);
            value=String.valueOf(valueLong);
        }
        return value;
    }
}    get

 

第三步:測試it

SensitiveUtils.getBean(Object) 
SensitiveUtils.註解類型(字段)io

相關文章
相關標籤/搜索