java-example:masktostring
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java-example:masktostring [2021/12/20 09:20] – morgan0329 | java-example:masktostring [2021/12/20 09:24] (current) – [ValidationF] morgan0329 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== MaskToStringBuilder ====== | ||
+ | <code java> | ||
+ | package com.xiaosq.common; | ||
+ | import java.lang.annotation.Annotation; | ||
+ | import java.lang.reflect.Field; | ||
+ | import java.util.Map; | ||
+ | import org.apache.commons.lang3.builder.ReflectionToStringBuilder; | ||
+ | import org.apache.commons.lang3.builder.ToStringStyle; | ||
+ | /** | ||
+ | * @author Morgan.L | ||
+ | * @version 1.0 | ||
+ | * @date 2019/7/9 17:10 | ||
+ | */ | ||
+ | public class MaskToStringBuilder extends ReflectionToStringBuilder { | ||
+ | |||
+ | public MaskToStringBuilder(Object object) { | ||
+ | super(object); | ||
+ | } | ||
+ | |||
+ | public MaskToStringBuilder(Object object, ToStringStyle style) { | ||
+ | super(object, | ||
+ | } | ||
+ | |||
+ | public MaskToStringBuilder(Object object, ToStringStyle style, StringBuffer buffer) { | ||
+ | super(object, | ||
+ | } | ||
+ | |||
+ | public MaskToStringBuilder(Object object, ToStringStyle style, StringBuffer buffer, Class reflectUpToClass, | ||
+ | super(object, | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | protected Object getValue(Field field) throws IllegalArgumentException, | ||
+ | for (Annotation annotation : field.getDeclaredAnnotations()) { | ||
+ | if (annotation instanceof SensitiveF && field.get(this.getObject()) != null) { | ||
+ | SensitiveF.Type type = ((SensitiveF) annotation).type(); | ||
+ | if (String.class.equals(field.get(this.getObject()).getClass())) { | ||
+ | String fieldValue = (String) field.get(this.getObject()); | ||
+ | |||
+ | return MaskUtil.doMask(type, | ||
+ | |||
+ | // | ||
+ | } else if (field.get(this.getObject()) instanceof Iterable) { | ||
+ | |||
+ | StringBuilder stringBuilder = new StringBuilder(); | ||
+ | stringBuilder.append(' | ||
+ | boolean appended = false; | ||
+ | |||
+ | for (String fieldValue : (Iterable< | ||
+ | if (appended) { | ||
+ | stringBuilder.append(',' | ||
+ | } | ||
+ | stringBuilder.append(MaskUtil.doMask(type, | ||
+ | appended = true; | ||
+ | } | ||
+ | stringBuilder.append(' | ||
+ | return stringBuilder.toString(); | ||
+ | |||
+ | // | ||
+ | } else if (field.get(this.getObject()) instanceof Map) { | ||
+ | |||
+ | StringBuilder stringBuilder = new StringBuilder(); | ||
+ | stringBuilder.append(' | ||
+ | boolean appended = false; | ||
+ | for (Map.Entry< | ||
+ | if (appended) { | ||
+ | stringBuilder.append(',' | ||
+ | } | ||
+ | |||
+ | if (entry.getKey() != null && entry.getKey() instanceof String) { | ||
+ | String fieldValue = (String) entry.getKey(); | ||
+ | stringBuilder.append(MaskUtil.doMask(type, | ||
+ | } else { | ||
+ | stringBuilder.append((String) entry.getKey()); | ||
+ | } | ||
+ | |||
+ | stringBuilder.append(' | ||
+ | |||
+ | if (entry.getValue() != null && entry.getValue() instanceof String) { | ||
+ | String fieldValue = (String) entry.getValue(); | ||
+ | stringBuilder.append(MaskUtil.doMask(type, | ||
+ | } else { | ||
+ | stringBuilder.append((String) entry.getValue()); | ||
+ | } | ||
+ | appended = true; | ||
+ | } | ||
+ | stringBuilder.append(' | ||
+ | return stringBuilder.toString(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return super.getValue(field); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ====== SensitiveF ====== | ||
+ | <code java> | ||
+ | package com.xiaosq.common; | ||
+ | |||
+ | import java.lang.annotation.ElementType; | ||
+ | import java.lang.annotation.Retention; | ||
+ | import java.lang.annotation.RetentionPolicy; | ||
+ | import java.lang.annotation.Target; | ||
+ | |||
+ | /** | ||
+ | * @author Morgan.L | ||
+ | * @version 1.0 | ||
+ | * @date 4/9/2020 4:15 PM | ||
+ | */ | ||
+ | @Retention(RetentionPolicy.RUNTIME) | ||
+ | @Target({ElementType.FIELD, | ||
+ | public @interface SensitiveF { | ||
+ | |||
+ | enum Type {PhoneNo, Password, IdNo, BankCardNo, RealName} | ||
+ | |||
+ | Type type(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====== MaskUtil ====== | ||
+ | <code java> | ||
+ | package com.xiaosq.common; | ||
+ | |||
+ | import com.spcredit.core.util.SensitiveF; | ||
+ | import org.apache.commons.lang3.StringUtils; | ||
+ | |||
+ | public class MaskUtil { | ||
+ | |||
+ | private static int[] generateMaskRule(SensitiveF.Type type, String fieldValue) { | ||
+ | // | ||
+ | // | ||
+ | int[] result = {0, 0}; | ||
+ | |||
+ | if (SensitiveF.Type.PhoneNo.equals(type) | ||
+ | || SensitiveF.Type.IdNo.equals(type) | ||
+ | || SensitiveF.Type.BankCardNo.equals(type)) { | ||
+ | result[0] = 4; | ||
+ | result[1] = 4; | ||
+ | |||
+ | } else if (SensitiveF.Type.RealName.equals(type)) { | ||
+ | if (StringUtils.isNotBlank(fieldValue)) { | ||
+ | if (fieldValue.length() > 2) { | ||
+ | result[0] = 1; | ||
+ | result[1] = 1; | ||
+ | } else { | ||
+ | result[0] = 1; | ||
+ | result[1] = 0; | ||
+ | } | ||
+ | } | ||
+ | } else { | ||
+ | // | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * liaowenyue: | ||
+ | * fieldValue 需要掩码的字段的值 | ||
+ | * prefixShowLength 前面需要显示的字符数 | ||
+ | * type 敏感数据类型 | ||
+ | */ | ||
+ | public static String doMask(SensitiveF.Type type, String fieldValue) { | ||
+ | int[] maskRule = generateMaskRule(type, | ||
+ | String maskStr = " | ||
+ | |||
+ | if (StringUtils.isBlank(fieldValue)) { | ||
+ | return fieldValue; | ||
+ | } | ||
+ | |||
+ | int showLength = maskRule[0] + maskRule[1]; | ||
+ | if (showLength < fieldValue.length()) { | ||
+ | StringBuilder sb = new StringBuilder(); | ||
+ | for (int j = 0; j < fieldValue.length(); | ||
+ | if (j < maskRule[0]) { | ||
+ | sb.append(fieldValue.charAt(j)); | ||
+ | continue; | ||
+ | } | ||
+ | if (j > (fieldValue.length() - 1 - maskRule[1])) { | ||
+ | sb.append(fieldValue.charAt(j)); | ||
+ | continue; | ||
+ | } | ||
+ | sb.append(maskStr); | ||
+ | } | ||
+ | return sb.toString(); | ||
+ | } else { | ||
+ | return fieldValue; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ |