基于springboot2 mysql Mybatis拦截器 实现 数据库脱敏

在 Spring Boot 2 中使用 MySQL 和 MyBatis 实现数据库脱敏,你可以考虑借助 MyBatis 的拦截器机制来实现。下面是一个简单的示例,演示如何在查询数据时进行脱敏处理。

假设有一个实体类 User,其中包含需要脱敏的字段,比如 nameemail

public class User {private Long id;private String name;private String email;// 省略构造函数、getter 和 setter
}

接下来,创建一个 MyBatis 的拦截器类,实现 Interceptor 接口。在拦截器中,你可以检查 SQL 语句,并对查询结果进行脱敏处理:

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;import java.sql.Statement;
import java.util.Properties;@Intercepts({@Signature(type = Executor.class,method = "query",args = {MappedStatement.class, Object.class, Statement.class})
})
public class DesensitizationInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object[] args = invocation.getArgs();MappedStatement mappedStatement = (MappedStatement) args[0];Object parameter = args[1];// 判断是否是查询操作if (mappedStatement.getSqlCommandType().name().startsWith("SELECT")) {// 进行脱敏处理if (parameter instanceof User) {User user = (User) parameter;user.setName(desensitize(user.getName()));user.setEmail(desensitizeEmail(user.getEmail()));}}return invocation.proceed();}private String desensitize(String input) {// 实现你的脱敏逻辑,这里简单地用 "*" 替换字符return "****";}private String desensitizeEmail(String email) {// 对邮箱进行特定的脱敏逻辑,例如保留邮箱前缀,替换中间字符int atIndex = email.indexOf('@');if (atIndex > 0) {String prefix = email.substring(0, atIndex);return prefix.substring(0, Math.min(3, prefix.length())) + "****" + email.substring(atIndex);}return desensitize(email);}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {// 可以在这里获取配置信息}
}

在拦截器中,我们使用 @Intercepts 注解标注拦截的方法,这里选择了 Executor.query 方法,表示拦截查询操作。在 intercept 方法中,我们对查询参数进行判断,如果是 User 类型,则对需要脱敏的字段进行处理。

最后,在 application.propertiesapplication.yml 中配置 MyBatis 的拦截器:

mybatis:configuration:# 设置拦截器interceptor:- com.example.DesensitizationInterceptor

这是一个简单的示例,实际应用中你可能需要根据具体需求实现更复杂的脱敏逻辑。在真实的系统中,请谨慎处理敏感数据,并确保符合相关法规和安全标准。


Mybatis拦截器 主要场景,请基于springboot2 mysql Mybatis拦截器 给出一个场景的代码示例

MyBatis 拦截器主要用于在执行 SQL 语句前后,以及在执行器方法前后进行拦截和增强。一个常见的使用场景是记录 SQL 执行时间。下面是一个基于 Spring Boot 2、MySQL 和 MyBatis 拦截器的场景代码示例,演示如何实现一个简单的 SQL 执行时间记录拦截器:

  1. 创建一个 SqlInterceptor 拦截器类:
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;import java.util.Properties;@Intercepts({@Signature(type = Executor.class,method = "update",args = {MappedStatement.class, Object.class}),@Signature(type = Executor.class,method = "query",args = {MappedStatement.class, Object.class})
})
public class SqlInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {long startTime = System.currentTimeMillis();try {return invocation.proceed();} finally {long endTime = System.currentTimeMillis();long elapsedTime = endTime - startTime;// 获取执行的 SQL 语句信息MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];String sqlId = mappedStatement.getId();String sqlCommandType = mappedStatement.getSqlCommandType().toString();System.out.println(String.format("SQL ID: %s, Type: %s, Time: %d ms", sqlId, sqlCommandType, elapsedTime));}}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {// 在这里可以获取配置信息}
}
  1. 在 Spring Boot 项目的配置文件中注册该拦截器:
mybatis:configuration:# 设置拦截器interceptor:- com.example.SqlInterceptor

这个拦截器会在执行 SQL 语句前后记录 SQL ID、类型以及执行时间。在实际应用中,你可能需要根据具体场景定制拦截器,比如实现缓存优化、权限控制、参数脱敏等。

请注意,MyBatis 拦截器在应用中的使用场景非常灵活,可以根据具体需求进行定制,以满足不同的业务需求。

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

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

相关文章

ZooKeeper 如何保证数据一致性?

在分布式场景中,ZooKeeper 的应用非常广泛,比如数据发布和订阅、命名服务、配置中心、注册中心、分布式锁等。 ZooKeeper 提供了一个类似于 Linux 文件系统的数据模型,和基于 Watcher 机制的分布式事件通知,这些特性都依赖 ZooKee…

【开源】基于JAVA语言的桃花峪滑雪场租赁系统

项目编号: S 036 ,文末获取源码。 \color{red}{项目编号:S036,文末获取源码。} 项目编号:S036,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设…

Redis数据存储:高效、灵活、实时

目录 引言 1. Redis概述 1.1 什么是Redis? 1.2 Redis的数据结构 1.3 Redis的持久化机制 2. Redis的使用场景 2.1 缓存 2.2 会话存储 2.3 发布/订阅系统 2.4 计数器和排行榜 3. Redis最佳实践 3.1 数据模型设计 3.2 键的命名规范 3.3 事务和原子操作 3…

国产AI边缘计算盒子,双核心A55丨2.5Tops算力

边缘计算盒子 双核心A55丨2.5Tops算力 ● 2.5TopsINT8算力,支持INT8/INT4/FP16多精度混合量化。 ● 4路以上1080p30fps视频编解码,IVE模块独立提供图像基础算子加速。 ● 支持Caffe、ONNX/PyTorch深度学习框架,提供resnet50、yolov5等AI算…

西南科技大学模拟电子技术实验四(集成运算放大器的线性应用)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 反相比例运算电路(1)实验…

【开源视频联动物联网平台】j2mod 库写一个Modbus RTU 服务器

J2Mod是一个Java编写的Modbus通信库,可以用于实现Modbus RTU服务器。以下是一个简单的示例,演示如何使用J2Mod库创建一个Modbus RTU服务器: 添加J2Mod库依赖项: 首先,确保在项目中包含J2Mod库。你可以将J2Mod库添加到…

C++包装类

C包装类是为了统一解决一些调用问题,在C中:“函数指针回调、仿函数、lambda表达式”都属于可调用对象,他们都可以达到函数函数的行为,达到回调函数和事件处理的功能。 但他们各有优缺点: 函数指针:符合C/…

QT 中 QDateTime::currentDateTime() 输出格式备查

基础 QDateTime::currentDateTime() //当前的日期和时间。 QDateTime::toString() //以特定的格式输出时间,格式 yyyy: 年份(4位数) MM: 月份(两位数,07表示七月) dd: 日期(两位数&#xff0c…

合成相机模型【图形学】

相机在计算机图形学中有两个方面的考虑:相机的位置和相机的形状。 要了解后者,我们需要了解相机的工作原理。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - R…

如何在Rocky Linux中安装nmon

一、环境基础 [rootlocalhost nmon16d]# cat /etc/redhat-release Rocky Linux release 9.2 (Blue Onyx) [rootlocalhost nmon16d]# uname -r 5.14.0-284.11.1.el9_2.x86_64 [rootlocalhost nmon16d]# 二、安装步骤 在Rocky Linux和AlmaLinux等基于RHEL 的发行版上&#xff…

编程实战:类C语法的编译型脚本解释器(四)

系列入口: 编程实战:类C语法的编译型脚本解释器(系列)-CSDN博客 本文介绍总入口和使用方法。 一、总入口 class IScript{private:CScript* m_p;string m_msg;public:IScript() :m_p(nullptr) {}string GetMessage()const;//连接bo…

前后端数据传输格式(上)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 作为后端,写…

C#,数值计算——插值和外推,三次样条插值(Spline_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 三次样条插值 /// Cubic Spline Interpolation /// Cubic spline interpolation object. Construct with x and y vectors, and /// (optionally) values of the first…

C++EasyX之井字棋

视频链接 井字棋 用EasyX和C实现井字棋小游戏 源码及注释 #include<graphics.h>char board_data[3][3] {{-,-,-},{-,-,-},{-,-,-}, };char current_piece O;//检测指定棋子的玩家是否获胜 bool CheckWin(char c) {// 检查每一行for (int i 0; i < 3; i){if (bo…

测试:性能测试

一、性能测试 性能测试是一种评估软件、系统或服务在特定条件下性能的过程。性能测试有助于确定系统的响应时间、吞吐量、可扩展性、稳定性和资源消耗等关键指标。 一、响应时间 响应时间&#xff08;Response Time&#xff09;是性能测试中的一个重要指标&#xff0c;用于衡…

算法学习系列(三):汉诺塔

目录&#xff1a; 引言一、问题描述二、问题求解三、测试四、附录&#xff08;所有代码&#xff09; 引言 这个汉诺塔问题就是一个典型的递归问题&#xff0c;这篇博客也算是上一篇的一个扩展吧&#xff0c;都是递归问题&#xff0c;这个问题太大&#xff0c;而且牵扯到的问题…

深度学习——第03章 Python程序设计语言(3.1 Python语言基础)

无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorch、TensorFlow也都是基于Python。本课程主要是围绕“理论实战”同时进行&#xff0c;所以本章将重点介绍深度学习中Python的必备…

webGIS使用JS,高德API完成智慧校园项目打卡功能

代码实现&#xff1a; var map new AMap.Map(container,{center:[],//目标点的中心位置zoom:16,viewMode:3D,pitch:45,})//使用控件AMap.plugin([AMap.ToolBar,AMap.Scale,AMap.ControlBar,AMap.HawkEye,AMap.MoveAnimation],function(){map.addControl(new AMap.ToolBar({ pos…

【Java面试——JUC全局观、原子类、锁、集合类、线程池、工具类】

目录 3.3 JUC全局观 JUC框架包含几个部分? Lock框架和Tools哪些核心的类? JUC并发集合哪些核心的类? JUC原子类哪些核心的类? JUC线程池哪些核心的类? 3.4 JUC原子类 线程安全的实现方法有哪些? 什么是CAS? CAS使用示例&#xff0c;结合AtomicInteger给出示例? CAS会有…

Python遥感开发之快速判断TIF数据为空

Python遥感开发之快速判断TIF数据为空 前言&#xff1a;介绍一下如何使用python下的gdal读取tif数据的时候&#xff0c;快速判断该tif数据是否为空&#xff0c;如果为空的话就把当前的tif删掉。 如图所示&#xff0c;通过arcgis查看箭头指向的为空值。 仅通过文件的大小无法判…