2:自定義註解日誌脫敏(半原創)

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 說明:自定義註解
* @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();

}—————-

import java.lang.reflect.Field;

import org.apache.commons.lang3.StringUtils;

/**
* 說明:脫敏工具類
* @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;

}

/**
 * 說明:  用戶名:只顯示第一個,其他隱藏爲星號<例子:李**>
 * @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), "*");
}


/**
 * 說明:  獲取脫敏對象
 * @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;
}

}

=========測試方法=========
第一種:
SensitiveUtils.getBean(Object)
SensitiveUtils.註解類型(字段)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章