mybatis拦截器自动加密解密教程
作者:码农本农。
这篇文章主要介绍了mybatis拦截器自动加密解密案例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
mybatis拦截器自动加密解密
来看实例
import kai8.system.annotation.EncryptDecryptField;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.util.Objects;
@Slf4j
@Component
@Intercepts({
@Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class)
})
public class EncryptionInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
ParameterHandler item = (ParameterHandler) invocation.getTarget();
Field parameterObject = item.getClass().getDeclaredField("parameterObject");
parameterObject.setAccessible(true);
Object o = parameterObject.get(item);
if (!Objects.isNull(o)) {
Class<?> aClass = o.getClass();
for (; aClass != Object.class; aClass = aClass.getSuperclass()) {//向上循环 遍历父类
Field[] declaredFields = aClass.getDeclaredFields();
for (Field field : declaredFields) {
// 如果属性带有EncryptField注解放到要加解密的集合中
if (field.isAnnotationPresent(EncryptDecryptField.class)) {
field.setAccessible(true);
try {
// 假设你有某种方法获取加密值(根据你的逻辑)
String encryptedValue = (String) field.get(o);
if (encryptedValue != null && !"".equals(encryptedValue)) {
EncryptDecryptField annotation = field.getAnnotation(EncryptDecryptField.class);
Class<?> value = annotation.value();
Method method = value.getMethod(annotation.encrypt(), String.class);
Object invoke = method.invoke(value, encryptedValue);
field.set(o, invoke);
} else {
field.set(o, null);
}
} catch (IllegalAccessException e) {
// 处理异常
log.error(e.getMessage(), e);
}
}
}
}
}
return invocation.proceed();
}
}import kai8.system.annotation.EncryptDecryptField;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Statement;
import java.util.Objects;
@Slf4j
@Intercepts({@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})})
public class DecryptInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
ParameterHandler item = (ParameterHandler) invocation.getTarget();
Field parameterObject = item.getClass().getDeclaredField("parameterObject");
parameterObject.setAccessible(true);
Object o = parameterObject.get(item);
if (!Objects.isNull(o)) {
Class<?> aClass = o.getClass();
for (; aClass != Object.class; aClass = aClass.getSuperclass()) {//向上循环 遍历父类
Field[] declaredFields = aClass.getDeclaredFields();
for (Field field : declaredFields) {
// 如果属性带有EncryptField注解放到要加解密的集合中
if (field.isAnnotationPresent(EncryptDecryptField.class)) {
field.setAccessible(true);
try {
// 假设你有某种方法获取加密值(根据你的逻辑)
String encryptedValue = (String) field.get(o);
if (encryptedValue != null) {
EncryptDecryptField annotation = field.getAnnotation(EncryptDecryptField.class);
Class<?> value = annotation.value();
Method method = value.getMethod(annotation.decrypt(), String.class);
Object invoke = method.invoke(value, encryptedValue);
// String decryptedValue = ArithmeticAPI.base64Decod(encryptedValue);
field.set(o, invoke);
} else {
field.set(o, null);
}
} catch (IllegalAccessException e) {
// 处理异常
log.error(e.getMessage(), e);
}
}
}
}
}
return invocation.proceed();
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
