第一步:定義註解工具
/**
* 說明:自定義註解
* @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