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网络编程教程之设置请求超时的方法

    Java网络编程教程之设置请求超时的方法

    这篇文章主要给大家介绍了关于Java网络编程教程之设置请求超时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Java字符串替换的三种方法实际应用

    Java字符串替换的三种方法实际应用

    这篇文章主要给大家介绍了关于Java字符串替换的三种方法,replace和replaceAll是JAVA中常用的替换字符的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Spring中注解方式的异步请求

    Spring中注解方式的异步请求

    今天给大家整理了Spring中注解方式的异步请求的知识点,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • java数组输出的实例代码

    java数组输出的实例代码

    这篇文章主要介绍了java数组输出的实例代码,有需要的朋友可以参考一下
    2013-12-12
  • Spring框架应用的权限控制系统详解

    Spring框架应用的权限控制系统详解

    在本篇文章里小编给大家整理的是关于基于Spring框架应用的权限控制系统的研究和实现,需要的朋友们可以学习下。
    2019-08-08
  • Java数据结构之双端链表原理与实现方法

    Java数据结构之双端链表原理与实现方法

    这篇文章主要介绍了Java数据结构之双端链表原理与实现方法,简单描述了双端链表的概念、原理并结合实例形式分析了java实现双端链表的相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Java下载https文件并上传阿里云oss服务器

    Java下载https文件并上传阿里云oss服务器

    这篇文章主要介绍了Java下载https文件并上传到阿里云oss服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java实现求小于n的质数的3种方法

    Java实现求小于n的质数的3种方法

    这篇文章主要介绍了Java实现求小于n的质数的3种方法,本文给出了根据定义去求解、平方根、找规律三种解法,需要的朋友可以参考下
    2015-03-03
  • Maven安装与配置及Idea配置Maven的全过程

    Maven安装与配置及Idea配置Maven的全过程

    Maven是一个项目管理工具,可以对Java项目进行自动化的构建和依赖管理,下面这篇文章主要给大家介绍了关于Maven安装与配置及Idea配置Maven的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • idea生成WebServices接口的完整流程步骤

    idea生成WebServices接口的完整流程步骤

    因为工作需要,数据传输部分需要使用webservice实现,经过两天的研究,实现了一个简单的例子,这篇文章主要给大家介绍了关于idea生成WebServices接口的完整流程步骤,需要的朋友可以参考下
    2024-08-08

最新评论