mybatis、mybatis-plus插件开发,实现数据脱敏功能

news2024/10/7 7:27:31

首先说一下mybatis中四大组件的作用,下面开发的插件拦截器会使用
四大组件Executor、StatementHandler、ParameterHandler、ResultSetHandler


Executor:

Executor 是 MyBatis 中的执行器,负责 SQL 语句的执行工作。它通过调度 StatementHandler、ParameterHandler 和 ResultSetHandler 来完成 SQL 的增删改查操作。Executor 管理事务和缓存,可以是 SimpleExecutor、ReuseExecutor、BatchExecutor 或在开启二级缓存时的 CachingExecutor。

ParameterHandler:

ParameterHandler 用于处理 SQL 语句的参数设置。它将 Mapper 接口方法的参数封装,并负责将这些参数值传递给 PreparedStatement,以便进行预编译和执行。ParameterHandler 通过 TypeHandler 接口完成 Java 类型到 JDBC 类型的转换。

ResultSetHandler:

ResultSetHandler 负责处理 SQL 执行后的返回结果集(ResultSet)。它将结果集转换并映射到 Java 对象,完成从数据库字段到 Java 实体属性的映射工作。ResultSetHandler 能够处理多种结果集的复杂映射关系。

StatementHandler:

StatementHandler 是 MyBatis 中的语句处理器,它是四大对象的核心,起到承上启下的作用。StatementHandler 负责使用 JDBC 的 Statement(包括 PreparedStatement 和 CallableStatement)执行实际的数据库操作。它通过调用 ParameterHandler 来设置 SQL 参数,并通过调用 ResultSetHandler 来处理查询结果。



实现思路:


1 首先我们需要对数据的结果集进行拦截,也就是说需要拦截这个接口的方法

2 得到数据返回的结果集后,对结果集转换成 List 进行遍历脱敏

3 脱敏的时候我们还需要判断一下哪些字段需要进行脱敏,这里我们定义注解来标识需要脱敏的字段(在这个注解里面可以定义一些脱敏策略,比如对手机号的脱敏规则、身份证的脱敏规则等等)

4 遍历的时候通过反射,获取所有属性

5 我这里的脱敏有三个条件

        a、必须带有 脱敏标识注解
        b、必须是 String 类型
        c、不得为空,这里直接使用工具类来判断 StringUtils.isEmpty()


6 脱敏条件达成后,就获取该注解上的 脱敏策略,根据脱敏策略 对属性进行脱敏

7 将脱敏后的结果重新设置到属性上


具体实现步骤


定义注解和不同的脱敏策略

import java.util.function.Function;

//这里的Function是jdk8新特性,自己了解一哈子
//提示:传入一个函数执行
public interface Desensitizer extends Function<String,String> {

}
//这里定义脱敏策略
public enum TuoMinStrategy {
    
    /*手机号*/
    PHONE(s->s.replaceAll("^(\\\\d{3})\\\\d{4}(\\\\d{4})$","$1****$2")),
    /*用户名 匹配中文全部替换*/
    USERNAME(s->s.replaceAll("[\\u4e00-\\u9fa5]","*"));

    private final Desensitizer desensitizer;

    TuoMinStrategy(Desensitizer d) {
        desensitizer = d;
    }

    public Desensitizer getDesensitizer() {
        return desensitizer;
    }
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//作用于属性上
@Target(ElementType.FIELD)
//运行时生效
@Retention(RetentionPolicy.RUNTIME)
public @interface TuoMin {

    /**
     * 脱敏策略
     * @return
     */
    TuoMinStrategy strategy();

}

脱敏插件核心类
注意:注解中的属性,method和args不是硬背的,有技巧,如这个,
ResultSetHandler类,点进去,要拦截哪个方法,方法名直接复制,方法里的参数,直接copy 引用

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 org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.List;
import java.util.stream.Stream;

@Component //需要放入到 ioc 容器中拦截器才会生效哦
//指定要拦截的目标方法的注解
//<h1>1、这个就是指定需要拦截的方法,这里我们指定拦截返回结果集的方法</h1>
@Intercepts(@Signature(type = ResultSetHandler.class,method = "handleResultSets",args= Statement.class))
public class TongMinPlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
       	//<h1>2、得到数据返回的结果集,对结果集转换成 List<Object> 进行遍历脱敏</h1>
        List<Object> records = (List<Object>) invocation.proceed();
        System.out.println("records = " + records);
        // 遍历数据 调用 tuoMin 这个方法
        records.forEach(this::tuoMin);
        return records;
    }

    private void tuoMin(Object source) {
        Class<?> sourceClass = source.getClass();
        System.out.println("sourceClass = " + sourceClass);
        MetaObject metaObject = SystemMetaObject.forObject(source);//这个东东是 mybatis 提供的,通过这个玩意我们可以得到属性的值
        System.out.println("metaObject = " + metaObject);
        // 使用 stream 流
        /**
         * 1、得到所有属性
         * 2、筛选出带有 TuoMin.class 注解的属性
         * 3、调用doTuoMin方法将这些属性脱敏
         */
        Stream.of(sourceClass.getDeclaredFields())
                .filter(field -> field.isAnnotationPresent(TuoMin.class))
                .forEach(field->doTuoMin(metaObject,field));
    }

    private void doTuoMin(MetaObject metaObject, Field field) {
        System.out.println("metaObject = " + metaObject);
        System.out.println("field = " + field);

        String name = field.getName();
        System.out.println("name = " + name);
        Object value = metaObject.getValue(name);//根据属性名得到属性值
        System.out.println("value = " + value);
        // 脱敏条件:必须为String类型,值不等于空
        if (String.class == metaObject.getGetterType(name) && StringUtils.hasText(value.toString())) {
            //获取脱敏策略
            TuoMin tuoMin = field.getAnnotation(TuoMin.class);
            System.out.println("tuoMin = " + tuoMin);
            TuoMinStrategy type = tuoMin.strategy();
            System.out.println("type = " + type);
            // 调用策略正则表达式脱敏,得到结果
            Object apply = type.getDesensitizer().apply((String) value);
            System.out.println("apply = " + apply);
            // 将脱敏后的结果重新设置到属性上
            metaObject.setValue(name,apply);
        }
    }

}

3 在需要脱敏的pojo的字段上加上注解,如

@TableField(value = "title")
@TuoMin(strategy = TuoMinStrategy.USERNAME) //加上注解并指定脱敏策略
private String title;

测试,举例

脱敏前:
张三达美

脱敏后:
张 * * 美


部分文字和代码引用博文
【MyBatis】脱敏插件_前端脱敏插件是什么-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯算法双周赛

四、赛后真题解析 比赛赛后将提供免费直播讲解&#xff0c;主讲人&#xff1a;待定。时间&#xff1a;07 月 13 日&#xff08;比赛当日&#xff09;晚 21 时。观看直播地址&#xff1a;第3场蓝桥算法季度赛赛后题解直播 - 蓝桥云课 - 哔哩哔哩直播&#xff0c;二次元弹幕直播…

为什么电量传感器在储能BMS应用中如此重要?

在储能系统中电池的充放电状态和使用寿命是保障系统健康稳定持久运行的关键因素&#xff0c;因此建立稳定可靠准确的电量检测方案至关重要。电流传感器在估算和延长电池使用寿命方面发挥着至关重要的作用&#xff0c;是储能电池检测系统中重要的一环。 关键词&#xff1a;电量…

vue选择上下周,拖拽列表,随机背景色

安装拖拽插件 npm install vuedraggable <template><!--排产计划--><div class"app-container"><div class"mainbox"><div class"table-container table-fullscreen"><div class"title-name">…

向openHarmony设备添加gdb调试工具

1. 下载gdb源码 国内从官网下载源码比较慢&#xff0c;可以从清华的镜像网站&#xff08;清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff09;上下载。下载地址&#xff1a; Index of /gnu/gdb/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择…

喜讯|华院计算认知智能引擎算法平台荣登BPAA大赛创新组TOP50

6月25日&#xff0c;备受瞩目的BPAA第四届全球应用算法模型典范大赛&#xff08;以下简称“BPAA大赛”&#xff09;正式揭晓了《第四届全球应用算法模型典范大赛创业组TOP50榜单》和《第四届全球应用算法模型典范大赛创新组TOP50榜单》。其中&#xff0c;华院计算技术&#xff…

Python课程设计:python制作俄罗斯方块小游戏

基于python的俄罗斯方块小游戏 目录 基于python的俄罗斯方块小游戏 1.概述 1.1 摘要 1.2 开发背景 1.3 开发环境 1.4 实现功能 2.代码描述 2.1 模块导入 2.2 初始化变量 2.3 播放音乐 2.4 创建方块类 2.5 绘制游戏地图 2.6 游戏初始化 2.7 绘制有边框矩形 2.8 …

go使用grpc编辑器 windows

先看最后效果&#xff1a; 当我执行 protoc --go_out. proto.proto 会生成proto.pb.go文件&#xff0c;主要存储的是封装好的结构体 执行 protoc --go-grpc_out. proto.proto 会生成对应的方法 那么现在提供解决方案&#xff1a; https://github.com/protocolbuffers…

kafka的架构

一、架构图 Broker&#xff1a;一台 kafka 服务器就是一个 broker。一个kakfa集群由多个 broker 组成。一个 broker 可以容纳多个 topic。 Producer&#xff1a;消息生产者&#xff0c;就是向 kafka broker 发消息的客户端 Consumer&#xff1a;消息消费者&#xff0c;向 kafk…

软考中级系统集成项目管理工程师备考笔记

目录 一&#xff0c;通用内容 &#xff08;一&#xff09;信息与信息化 1.1&#xff0c;信息 信息基本概念 信息的传输模型 信息的质量属性 1.2&#xff0c;信息系统 信息系统的基本概念 信息系统定义 信息系统集成 1.3&#xff0c;信息化 信息化层次 信息化的核心…

Prometheus在金融行业信息系统运维管理中的应用:实践与案例分析

Prometheus在金融行业信息系统运维管理中的应用&#xff1a;实践与案例分析 Prometheus是一款开源的监控系统和时序数据库&#xff0c;被广泛应用于各种行业的运维管理中&#xff0c;特别是在金融行业。它具有强大的数据采集和分析能力&#xff0c;能够实时监控系统的性能和状…

华为eNSP模拟器安装详细步骤

安装准备 安装eNSP需要先安装三个依赖软件才能运行&#xff0c;分别是VirtualBox、WinPcap、Wireshark 下载地址如下 eNSP&#xff1a;http://cloud.rsecc.cn/softlink/eNSP%20V100R003C00SPC100%20Setup.exe VirtualBox&#xff1a;http://cloud.rsecc.cn/softlink/Virtua…

Steam页面打不开?steam显示当前游戏不可用是怎么回事

Steam是全球最大的游戏综合发行平台&#xff0c;每年为无数玩家呈现了多款精彩游戏&#xff0c;不过由于网络问题或其他异常因素影响&#xff0c;有很多玩家会在访问steam或steam的游戏商品页时&#xff0c;遇到Steam提示当前游戏在您平台不可用、打不开游戏页面的情况&#xf…

自动化测试报告pytest-html样式美化

最近我将 pytest-html 样式优化了 一版 先看优化前&#xff1a; 优化后&#xff1a; 优化内容包括&#xff1a; 删除部分多余字段新增echart图表部分字体大小、行间距、颜色做了美化调整运行环境信息移至报告最后部分字段做了汉化处理&#xff08;没全部翻译是因为&#xf…

七天速通javaSE:第七天 面向对象:封装继承与多态

文章目录 前言一、封装1. 属性私有2. get&#xff0c;set3. 修饰符的可访问性4. 特点总结 二、继承1. 子承父业&#xff1a;extends2. 区分父子&#xff1a;super2.1 属性2.2 方法重写 三、多态&#xff08;不同类继承同一个类&#xff09; 前言 一、封装 概念&#xff1a;封装…

等保测评应该选择什么样的SSL证书

选择适合等保测评的SSL证书&#xff0c;需考虑证书的加密强度、认证机制以及是否满足国家相关的密码技术要求 1、证书类型&#xff1a;应选择符合国家或行业标准的SSL证书&#xff0c;这些证书通常采用RSA、DSA或ECC等国际认可的加密算法。同时&#xff0c;考虑到国内特定的合规…

IP地址修改方法攻略:类型、步骤与注意事项

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识符&#xff0c;其重要性不言而喻。然而&#xff0c;在某些特定场景下&#xff0c;如保护个人隐私、绕过网络限制或实现特定网络访问需求&#xff0c;修改IP地址就显得尤为关键。本文将详细介绍IP地址修改方法有哪几种类型…

13. Java 生产者与消费者案例

1. 前言 本节内容是通过之前学习的 synchronized 关键字&#xff0c;实现多线程并发编程中最经典的生产者与消费者模式&#xff0c;这是本节课程的核心内容&#xff0c;所有的知识点都是围绕这一经典模型展开的。本节有如下知识点&#xff1a; 生产者与消费者模型介绍&#x…

昇思25天学习打卡营第13天 | SSD目标检测

模型简介 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)以及59FPS&#x…

周界入侵自动监测摄像机

当今&#xff0c;随着科技的快速发展&#xff0c;周界入侵自动监测摄像机作为安全监控领域的重要创新&#xff0c;正逐渐成为各类场所安全防范的核心设备。这种摄像机以其先进的监测和预警功能&#xff0c;有效提升了安全管理的效率和实时响应能力&#xff0c;被广泛应用于各类…

电子看板,帮助工厂实现数字化管理

在数字化浪潮的推动下&#xff0c;制造业正经历着深刻的变革&#xff0c;数字工厂成为了行业发展的新趋势。而生产管理看板作为一种重要的管理工具&#xff0c;在提升数字工厂管理效率方面发挥着关键作用。 生产管理看板通过实时数据的展示&#xff0c;为数字工厂提供了清晰的全…