实现思路
- mybatis配置类中加入自定义拦截器
- 自定义拦截器对指定mapper层指定方法(修改或新增相关业务表的方法)进行拦截,对指定属性或字段进行加解密操作
实现代码
package com.pica.cloud.patient.health.server.annotation;
import com.google.common.collect.Lists;
import com.pica.cloud.foundation.entity.PicaWarnException;
import com.pica.cloud.patient.health.common.enums.HealthResultCode;
import com.pica.cloud.patient.health.common.utils.EncryptUtils;
import com.pica.cloud.patient.health.server.entity.*;
import com.pica.cloud.patient.health.server.model.patient.PatDocPatModel;
import com.pica.cloud.patient.health.server.util.EmojiFilterUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import java.lang.reflect.Field;
import java.util.*;
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {
MappedStatement.class, Object.class})})
public class EncryptNameIdInterceptor implements Interceptor {
private static final List<String> handlerMethod = Lists.newArrayList(
"com.pica.cloud.patient.server.mapper.PatPatientInfoMapper.updateByPrimaryKeySelective",
"com.pica.cloud.patient.server.mapper.PatPatientInfoMapper.insertBatchPatientInfo",
"com.pica.cloud.patient.server.mapper.PatPatientInfoMapper.updateByExampleSelective",
"com.pica.cloud.patient.server.mapper.PatPatientMapper.insertBatchPatientBasic",
"com.pica.cloud.patient.server.mapper.PatHospitalPatInfoMapper.insertBatch",
"com.pica.cloud.patient.server.mapper.PatHospitalPatInfoMapper.batchUpdate",
"com.pica.cloud.patient.server.mapper.PatDocPatInfoMapper.insertBatch"
);
@Override
public Object intercept(Invocation invocation) throws Throwable {
final MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
Executor executor = (Executor) invocation.getTarget();
Object parameter;
boolean isEncrypted = false;
parameter = invocation.getArgs()[1];
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
if (parameter instanceof PatPatientInfo || parameter instanceof PatPatient || parameter instanceof PatientInfo
|| parameter instanceof PatHospitalPatInfo || parameter instanceof PatDocPatMapping
|| parameter instanceof PatDocPatInfo || parameter instanceof PatDocPatModel
|| handlerMethod.contains(mappedStatement.getId())) {
Object obj = boundSql.getParameterObject();
isEncrypted = dealPatientValue(obj, true, parameter);
}
Object result = executor.update(mappedStatement, parameter);
if (isEncrypted) {
Object obj = boundSql.getParameterObject();
dealPatientValue(obj, false, parameter);
}
return result;
}
private boolean dealPatientValue(Object obj, boolean encryptFlag, Object parameter) throws IllegalAccessException {
boolean isEncrypted = false;
if (obj != null) {
if (parameter instanceof Map) {
Map