2:自定義註解日誌脫敏(半原創)
阿新 • • 發佈:2019-01-08
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.註解型別(欄位)