mybatis拦截器自动加密解密教程

 更新时间:2025年08月08日 11:19:36   作者:码农本农。  
这篇文章主要介绍了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();
    }
}

总结

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

相关文章

  • Java中如何编写一个数的n次方(幂运算)?

    Java中如何编写一个数的n次方(幂运算)?

    本文介绍了使用pow函数和自定义for循环计算幂的O(n)时间复杂度方法,然后重点讲解了快速幂算法的分治思想,以及从二进制角度的解释,包括如何通过位运算和循环迭代实现高效计算,给出了Java代码实现
    2024-07-07
  • Java实现字符串转换成可执行代码的方法

    Java实现字符串转换成可执行代码的方法

    今天小编就为大家分享一篇Java实现字符串转换成可执行代码的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 超个性修改SpringBoot项目的启动banner的方法

    超个性修改SpringBoot项目的启动banner的方法

    这篇文章主要介绍了超个性修改SpringBoot项目的启动banner的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • java注解的类型知识点总结

    java注解的类型知识点总结

    在本篇文章里小编给大家整理了一篇关于java注解的类型知识点总结内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • 一文详解Spring中ResponseEntity包装器的使用

    一文详解Spring中ResponseEntity包装器的使用

    在 Spring 中,ResponseEntity 是 HTTP 响应的包装器,这篇文章主要为大家详细介绍了ResponseEntity包装器的使用,感兴趣的可以了解一下
    2025-02-02
  • 基于FLink实现实时安全检测的示例代码

    基于FLink实现实时安全检测的示例代码

    这篇文章主要为大家详细介绍了如何基于FLink实现实时安全检测的功能,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以了解一下
    2023-02-02
  • SpringBoot中整合Ehcache实现热点数据缓存的详细过程

    SpringBoot中整合Ehcache实现热点数据缓存的详细过程

    这篇文章主要介绍了SpringBoot中整合Ehcache实现热点数据缓存,SpringBoot 中使用 Ehcache 比较简单,只需要简单配置,说白了还是 Spring Cache 的用法,合理使用缓存机制,可以很好地提高项目的响应速度,需要的朋友可以参考下
    2023-04-04
  • Java利用Jackson轻松处理JSON序列化与反序列化

    Java利用Jackson轻松处理JSON序列化与反序列化

    Jackson 是 Java 中最流行的 JSON 处理库之一,它提供了许多注解来简化 JSON 的序列化和反序列化过程。这篇文章将介绍一些 Jackson 常用的注解,以帮助您更轻松地处理 JSON 数据
    2023-05-05
  • java GUI实现五子棋游戏

    java GUI实现五子棋游戏

    这篇文章主要为大家详细介绍了java GUI实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Java interrupt()方法使用注意_动力节点Java学院整理

    Java interrupt()方法使用注意_动力节点Java学院整理

    这篇文章主要介绍了Java interrupt()方法使用注意_动力节点Java学院整理,需要的朋友可以参考下
    2017-05-05

最新评论