我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mybatisPlus自定义拦截器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mybatisPlus自定义拦截器

mybatisPlus自定义拦截器

一开始数据库的数据是明文存储,后面某些数据需要变成密文保存在数据库,而且密文的字段在很多数据表中都存在。进行select操作时,把密文查询出来并转成明文。
1、使用切面,当接口获取到数据后,遍历数据找到密文字段,把密文解密得到明文
2、使用mybatisPlus自定义拦截器,在sql语句执行前拦截,把 字段 改成 IFNULL(AES_DECRYPT(UNHEX(字段), 密码),字段) AS 字段,sql语句可以解密得到明文。
下面是mybatisPlus自定义拦截器的代码:

@EnableTransactionManagement@Configurationpublic class MybatisPlusConfig {    @Resource    private DataScopeInterceptor dataScopeInterceptor;    @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor() {        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();        // 数据权限过滤        interceptor.addInnerInterceptor(dataScopeInterceptor);        return interceptor;    }}
@Componentpublic class DataScopeInterceptor implements InnerInterceptor {private static Set selectItemSet = new HashSet<>();    @Override    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {        String buildSql = boundSql.getSql();        try {            Statement statement = CCJSqlParserUtil.parse(buildSql);            Select select = (Select) statement;            processSelectBody(select.getSelectBody());            PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);            mpBoundSql.sql(select.toString());        } catch (JSQLParserException e) {            throw ExceptionUtils.mpe("Failed to process, Error SQL: %s", e.getCause(), buildSql);        } catch (BaseBusinessException be) {            log.warn(be.getMessage());        }    }    private void processSelectBody(SelectBody selectBody) throws BaseBusinessException, JSQLParserException {        if (selectBody == null) {            throw new BaseBusinessException(ResponseCodeEnum.IGNORE_DATA_SCOPE);            // return;        }        if (selectBody instanceof PlainSelect) {            processPlainSelect((PlainSelect) selectBody);        } else if (selectBody instanceof WithItem) {            WithItem withItem = (WithItem) selectBody;            processSelectBody(withItem.getSelectBody());        } else {            SetOperationList operationList = (SetOperationList) selectBody;            List selectBodys = operationList.getSelects();            if (CollectionUtils.isNotEmpty(selectBodys)) {                for (SelectBody body : selectBodys) {                    processSelectBody(body);                }            }        }    }    private void proprocessPlainSelect(PlainSelect plainSelect) throws JSQLParserException {        if(selectItemSet.size()>0) selectItemSet = new HashSet<>();        FromItem fromItem = plainSelect.getFromItem();        List joins = plainSelect.getJoins();        processSelectColumns(plainSelect, fromItem);        if (CollectionUtils.isNotEmpty(joins)) {            for (Join join : joins) {                if (join.isInner() || join.isFull() || join.isSimple()) {                    FromItem rightItem = join.getRightItem();                    processSelectColumns(plainSelect, rightItem);                } else if (join.isLeft()) {                    FromItem rightItem = join.getRightItem();                    processSelectColumns(plainSelect, rightItem);                } else if (join.isRight()) {                    FromItem rightItem = join.getRightItem();                    processSelectColumns(plainSelect, rightItem);                }            }        }        if (selectItemSet.size() == 0) return;        List filterItem = new ArrayList<>();        List selectItemList=selectItemSet.stream()                .filter(e -> {                    boolean found = !filterItem.contains(e.toString());                    filterItem.add(e.toString());                    return found;                })                .collect(Collectors.toList());        if (selectItemList.size() > 0) {            plainSelect.setSelectItems(selectItemList);        }    }    // select时解密; *号根据具体的表替换成具体的字段    private void processSelectColumns(PlainSelect plainSelect, FromItem fromItem) {    if (! (fromItem instanceof Table)) return;        Table table = (Table) fromItem;        for (SelectItem selectItem : plainSelect.getSelectItems()) {        // 1、做判断,不是需要解密的字段和*号就直接add        // 2、是需要解密的字段,则变成IFNULL(AES_DECRYPT(UNHEX(字段), 密码),字段) AS 字段,再add        // 3、*号则转换成具体的表字段,遍历表字段,是需要解密的字段则转换后add,不是就直接add。add前需要把字段String变成selectItem        // 最后。 sql语句会出现 table b;b.id bid、b.id、id;等情况,根据实际情况判断        selectItemSet.add(selectItem);        }    }

来源地址:https://blog.csdn.net/weixin_43381157/article/details/126764495

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mybatisPlus自定义拦截器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mybatisPlus自定义拦截器

mybatisPlus自定义拦截器 一开始数据库的数据是明文存储,后面某些数据需要变成密文保存在数据库,而且密文的字段在很多数据表中都存在。进行select操作时,把密文查询出来并转成明文。 1、使用切面,当接口获取到数据后,遍历数据找到密
2023-08-18

struts2拦截器怎么自定义

要自定义Struts2拦截器,您需要按照以下步骤进行操作:1. 创建一个实现 `com.opensymphony.xwork2.interceptor.Interceptor` 接口的类,例如 `CustomInterceptor`。```
2023-08-26

Spring中自定义拦截器怎么用

小编给大家分享一下Spring中自定义拦截器怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、创建自定义拦截器类(UserTokenInterceptor)
2023-06-29

Mybatis拦截器实现自定义需求

本文主要介绍了Mybatis拦截器实现自定义需求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-19

怎么自定义redis缓存拦截器

自定义Redis缓存拦截器的步骤如下:1. 创建一个实现了`HandlerInterceptor`接口的自定义类,并重写其三个方法`preHandle`、`postHandle`和`afterCompletion`。2. 在`preHand
2023-09-11

Android 中okhttp自定义Interceptor(缓存拦截器)

Android 中okhttp自定义Interceptor(缓存拦截器) 前言: 新公司项目是没有缓存的,我的天,坑用户流量不是么。不知道有人就喜欢一个界面没事点来点去的么。怎么办?一个字“加”。 由于项目的网络请求被我换成了retrofi
2022-06-06

链自定义 GRPC 客户端拦截器/DialOptions

在进行网络通信时,自定义GRPC客户端拦截器和DialOptions是非常有用的工具。这些工具可以帮助开发者在GRPC客户端中添加额外的功能和处理逻辑,以满足特定的需求。php小编香蕉在本文中将介绍如何使用这些工具来定制和优化GRPC客户端
链自定义 GRPC 客户端拦截器/DialOptions
2024-02-14

struts2自定义拦截器的示例代码

题目:使用struts2自定义拦截器,完成用户登陆才能访问权限的实现 在session中存放user变量表示用户登陆,若user为空则用户没有登陆,反之登陆 显示提示信息(请先登录)定义拦截器在struts.xml中定义拦截器使用标签<
2023-05-31

Springboot如何实现自定义mybatis拦截器

这篇文章将为大家详细讲解有关Springboot如何实现自定义mybatis拦截器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实践的准备 : 整合mybatis ,然后故意写了3个查询方法, 1个是li
2023-06-22

Java SpringMVC如何实现自定义拦截器

本篇内容主要讲解“Java SpringMVC如何实现自定义拦截器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java SpringMVC如何实现自定义拦截器”吧!SpringMVC实现自定义
2023-06-29

springboot自定义拦截器简单使用及举例

SpringBoot拦截器是AOP的一种实现,专门拦截对控制层的请求,主要应用于判断用户权限,拦截webSocket请求,下面这篇文章主要给大家介绍了关于springboot自定义拦截器简单使用及举例的相关资料,需要的朋友可以参考下
2023-01-28

拦截器在Spring MVC中怎么实现自定义

拦截器在Spring MVC中怎么实现自定义?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. 引言拦截器(Interceptor)实现对每一个请求处理前后进行
2023-05-31

MyBatis中怎么实现自定义的SQL拦截器

在 MyBatis 中实现自定义的 SQL 拦截器,通常可以通过实现 org.apache.ibatis.plugin.Interceptor 接口来实现。下面是一个简单的示例:创建一个自定义的拦截器类,实现 Interceptor 接口:
MyBatis中怎么实现自定义的SQL拦截器
2024-05-08

编程热搜

目录