在金融系统,客户的姓名、电话、身份证、卡号都必须保密;下面是几种隐位、涉及各种类型的报文,用正则屏蔽差异性
public class HiddenFieldUtil {
//日志
private static final Logger logger = LoggerFactory.getLogger(HiddenFieldUtil.class);
// 证件号隐位处理器
private static final HiddenFieldHandler.HiddenFieldHandlerInterface HIDDEN_ACCOUNTNO_HANDLER = new HiddenFieldHandler.HiddenAccountNoHandler();
// 名字隐位处理器
private static final HiddenFieldHandler.HiddenFieldHandlerInterface HIDDEN_NAME_HANDLER = new HiddenFieldHandler.HiddenAccountNameHandler();
// 身份证隐位处理器
private static final HiddenFieldHandler.HiddenFieldHandlerInterface HIDDEN_CERTNO_HANDLER = new HiddenFieldHandler.HiddenCertificateNoHandler();
// 手机号码隐位处理器
private static final HiddenFieldHandler.HiddenFieldHandlerInterface HIDDEN_PHONE_HANDLER = new HiddenFieldHandler.HiddenPhoneNoHandler();
/**
* 账户号隐位
*
* @param accountNo 账户号
* @return
*/
public static String hidingAccountNo(String accountNo) {
return HIDDEN_ACCOUNTNO_HANDLER.hiddenField(accountNo);
}
/**
* 姓名隐位处理
*
* @param accountName 账户名
* @return
*/
public static String hidingName(String accountName) {
return HIDDEN_NAME_HANDLER.hiddenField(accountName);
}
/**
* 身份证隐位处理
*
* @param certNo 身份证号码
* @return
*/
public static String hidingCertificateNo(String certNo) {
return HIDDEN_CERTNO_HANDLER.hiddenField(certNo);
}
/**
* 手机号码隐位
*
* @param phoneNo 手机号
* @return
*/
public static String hidingPhoneNo(String phoneNo) {
return HIDDEN_PHONE_HANDLER.hiddenField(phoneNo);
}
/**
* 隐位数字
*
* @param xmlStr 原始报文 xml格式
* @param fieldNames 里面四个值(节点),1,accountNo, 2,accountName,3,certificateNo ,4,phoneNo
* @return
*/
public static String hiddenInfoForXmlFormat(String xmlStr, String[] fieldNames) {
try {
if (!checkStringIfNotEmpty(xmlStr)) return ""; //报文为空直接返回
if (fieldNames == null || fieldNames.length == 0) return xmlStr; //无需隐位
StringBuilder sb = new StringBuilder(xmlStr);
if (fieldNames.length >= 1 && checkStringIfNotEmpty(fieldNames[0]))
sb = hiddenFiledForXmlFormat(sb, fieldNames[0], HIDDEN_ACCOUNTNO_HANDLER);//处理账号
if (fieldNames.length >= 2 && checkStringIfNotEmpty(fieldNames[1]))
sb = hiddenFiledForXmlFormat(sb, fieldNames[1], HIDDEN_NAME_HANDLER); //处理名字
if (fieldNames.length >= 3 && checkStringIfNotEmpty(fieldNames[2]))
sb = hiddenFiledForXmlFormat(sb, fieldNames[2], HIDDEN_CERTNO_HANDLER); //处理身份证号
if (fieldNames.length >= 4 && checkStringIfNotEmpty(fieldNames[3]))
sb = hiddenFiledForXmlFormat(sb, fieldNames[3], HIDDEN_PHONE_HANDLER);//处理手机号
return sb.toString();
} catch (Exception e) {
logger.error("hiddenInfoForXmlFormat failed:{}", xmlStr, e);
return "";
}
}
/**
* 隐位字段
*
* @param sb 原始报文 xml格式
* @param fieldName 需隐位的字段名
* @param hiddenFieldHandler 隐位处理器
* @return
*/
public static StringBuilder hiddenFiledForXmlFormat(StringBuilder sb, String fieldName, HiddenFieldHandler.HiddenFieldHandlerInterface hiddenFieldHandler) {
try {
int startIndex = sb.indexOf("<" + fieldName + ">");
if (startIndex != -1) {
int endIndex = sb.indexOf("</" + fieldName + ">");
int valueStartIndex = startIndex + ("<" + fieldName + ">").length();
String value = sb.substring(valueStartIndex, endIndex);
return sb.replace(valueStartIndex, endIndex, hiddenFieldHandler.hiddenField(value));
}
return sb;
} catch (Exception e) {
logger.error("hiddenFiledForXmlFormat failed,xmlStr:{},fieldName:{}", sb.toString(), fieldName, e);
return new StringBuilder("");
}
}
public static boolean checkStringIfNotEmpty(String param) {
return null != param && !"".equals(param.trim());
}
}
public class HiddenFieldHandler {
public static class HiddenAccountNoHandler implements HiddenFieldHandlerInterface {
@Override
public String hiddenField(String accountNo) {
try {
//显示前四位,后四位
StringBuffer accountAlias = new StringBuffer();
if (HiddenFieldUtil.checkStringIfNotEmpty(accountNo)) {
accountAlias.append("****").append(accountNo.substring(accountNo.length() - 4));
}
return accountAlias.toString();
} catch (Exception e) {
return "accountNo format wrong";
}
}
}
public static class HiddenAccountNameHandler implements HiddenFieldHandlerInterface {
@Override
public String hiddenField(String accountName) {
try {
//第一位用*代替
StringBuffer nameAlias = new StringBuffer();
if (HiddenFieldUtil.checkStringIfNotEmpty(accountName)) {
nameAlias.append("*").append(accountName.substring(1));
}
return nameAlias.toString();
} catch (Exception e) {
return "accountName format wrong";
}
}
}
public static class HiddenCertificateNoHandler implements HiddenFieldHandlerInterface {
@Override
public String hiddenField(String certNo) {
try {
//显示一位跟最后一位
String certNoStr = "";
if (HiddenFieldUtil.checkStringIfNotEmpty(certNo)) {
certNoStr = certNo.substring(0, 1) + "****************" + certNo.substring(certNo.length() - 1);
}
return certNoStr;
} catch (Exception e) {
return "certificateNo format wrong";
}
}
}
public static class HiddenPhoneNoHandler implements HiddenFieldHandlerInterface {
@Override
public String hiddenField(String phoneNo) {
try {
//显示前三位,后四位
String phoneAlias = "";
if (HiddenFieldUtil.checkStringIfNotEmpty(phoneNo)) {
phoneAlias = phoneNo.substring(0, 3) + "****" + phoneNo.substring(phoneNo.length() - 4);
}
return phoneAlias;
} catch (Exception e) {
return "phone format wrong";
}
}
}
public static interface HiddenFieldHandlerInterface {
/**
* 隐藏字段
*
* @param field 需要隐藏的字段
* @return
*/
String hiddenField(String field);
}
}