1:自定义注解
@Documented
@Inherited
@Target({ ElementType.TYPE,ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptDecrypt {
}
2:新建加密存储方法 ParammeterInterceptor 实现 Interceptor
@Intercepts({@Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class),})
@Component
@Slf4j
public class ParammeterInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
if (invocation.getTarget() instanceof ParameterHandler) {
// 获取参数
ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
// 获取参数字段
Field parameterField = parameterHandler.getClass().getDeclaredField("parameterObject");
parameterField.setAccessible(true);
// 获取实际入参对象
Object parameterObject = parameterField.get(parameterHandler);
if (Objects.nonNull(parameterObject)) {
Class<?> parameterObjectClass = parameterObject.getClass();
// 实际入参对象是否需要加密判断
EncryptDecrypt classAnnotation = AnnotationUtils.findAnnotation(parameterObjectClass, EncryptDecrypt.class);
if (Objects.nonNull(classAnnotation)) {
Field[] declaredFields = parameterObjectClass.getDeclaredFields();
for (Field field : declaredFields) {
// 实际入参对象字段是否需要加密判断
EncryptDecrypt fieldAnnotation = field.getAnnotation(EncryptDecrypt.class);
if (Objects.nonNull(fieldAnnotation)) {
field.setAccessible(true);
Object o = field.get(parameterObject);
field.set(parameterObject, new String(Base64.getEncoder().encode(((String) o).getBytes())));
}
}
}
}
}
return invocation.proceed();
}
@Override
public Object plugin(Object o) {
return Plugin.wrap(o, this);
}
@Override
public void setProperties(Properties properties) {
}
}
3:新建解密展示方法 ResultInterceptor 实现 Interceptor
@Intercepts({@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})})
@Component
@Slf4j
public class ResultInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object result = invocation.proceed();
if (Objects.isNull(result)) {
return null;
}
if (result instanceof ArrayList) {
ArrayList resultList = (ArrayList) result;
resultList.stream().forEach(data -> decrypt(data));
} else {
decrypt(result);
}
return result;
}
private void decrypt(Object result) {
try {
Class<?> resultClass = result.getClass();
EncryptDecrypt encryptDecryptClass = AnnotationUtils.findAnnotation(resultClass, EncryptDecrypt.class);
if (Objects.nonNull(encryptDecryptClass)) {
Field[] declaredFields = resultClass.getDeclaredFields();
for (Field field : declaredFields) {
EncryptDecrypt fieldAnnotation = field.getAnnotation(EncryptDecrypt.class);
if (Objects.nonNull(fieldAnnotation)) {
field.setAccessible(true);
Object o = field.get(result);
field.set(result, new String(Base64.getDecoder().decode(((String) o).getBytes())));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
4:实体类实现,类上加注解 @EncryptDecrypt,需要加密解密的字段一样加@EncryptDecrypt
@Data
@EncryptDecrypt
public class User {
@EncryptDecrypt
private String name;
private Integer age;
@EncryptDecrypt
private String idCard;
}