java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > mybatis拦截器自动加密解密

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();
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文