开发者

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 Javaphp.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.Intercepthttp://www.devze.comor;
    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<?&编程客栈gt; 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 {
                                // 假设你有某种方法获取加密值(根据javascript你的逻辑)
                                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 {
                             http://www.devze.com       field.set(o, null);
                                }
                            } catch (IllegalAccessException e) {
                                // 处理异常
                                log.error(e.getMessage(), e);
                            }
                        }
                    }
                }
            }
            return invocation.proceed();
        }
    }

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜