JavaWeb分页条件查询参数特殊字符处理

news/2025/2/6 4:33:59/

问题背景

在项目开发过程中,基本都会有列表条件查询,例如用户管理会有通过用户姓名模糊查询用户,课程管理会有课程名称模糊查询课程等等。

而查询过程中如果用户在界面上输入一些特殊字符,例如:%_等等,这时可以发现最终生成的SQL大致如下:

select * from t_user where name like '%%%'
select * from t_user where name like '%_%'

这样就会导致将用户表的所有数据都查询出来,这显然不是用户想看到的结果,用户的本意只是想找名字叫%的人,而由于这些字符因为在数据库(Mysql等)中有着特殊含义,

%表示任意字符,_表示任意一个字符,所有导致了这样的结果。

如何解决

很容易想到的解决方案就是在生成SQL的时候对这些个字符进行转义,让数据库将这些字符当作普通的字符串来处理,而不是字符通配符。

例如如果是使用mybatisplus可以这样写:

LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class)//使用对用户姓名里面的%_\进行替换.like(StringUtils.isNotBlank(qo.getName()), User::getName, replaceStr(qo.getName()));private String replaceStr(String str) {if (str != null && !"".equals(str)) {str = str.replaceAll("\\\\", "\\\\\\\\").replace("_", "\\_").replace("\'", "\\'").replace("%", "\\%").replace("*", "\\*");}return str;}

 

这样如果输入的name=%,最终生成的SQL如下:

select * from t_user where name like '%\%%'

这里的\%就会当作普通的字符串进行条件匹配,如果有name里面含有%就会被查询出来,满足了用户的期望。

但是,一个系统中这样的条件查询肯定不止一个,会有几十、几百个,每一个都这样处理会显得很麻烦,那有什么办法可以统一处理吗?

当然是有的,咱们不是有AOP嘛,对所有分页查询的入参做个拦截,对这些个特殊字符进行处理,然后再去调用接口就可以了,可以这样处理:

/*** 统一处理列表分页条件查询的入参的特殊字符* 再Mysql查询中有%_\三个特殊字符* %:代表通配符任意字符* _: 代表任意一个字符* \: 在Java代码中需要四个\\\\才能查出数据库中一个\***/
@Component
@Aspect
public class QueryRequestAspect {/*** 定义切面,根据自己的情况定义* 所有controller下面所有page开头的接口*/@Pointcut(value = "execution(* com.xxx.xxx.controller..*.page*(..))")private void queryPointCut() {}//可以使用Before类型的通知、也可以使用Around类型通知@SneakyThrows@Before(value = "queryPointCut()")public void process(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs();if (args != null && args.length != 0) {//对入参进行处理for (int i = 0; i < args.length; i++) {Field[] declaredFields = args[i].getClass().getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);Object o = declaredField.get(args[i]);if (o instanceof String) {declaredField.set(args[i], replaceStr((String) o));}}}}}private String replaceStr(String str) {if (str != null && !"".equals(str)) {str = str.replaceAll("\\\\", "\\\\\\\\").replace("_", "\\_").replace("\'", "\\'").replace("%", "\\%").replace("*", "\\*");}return str;}}

这样通过这个QueryRequestAspect 切面就可以统一处理分页查询的条件入参了。

参考资料:

Java查询Mysql数据库时,查询条件带特殊字符(\ % ‘ * _)的处理方式_查询数据库字段包含某特殊字符_weixin_43828846的博客-CSDN博客

SpringBoot AOP拦截、修改请求参数_aop 修改参数值_HouXinLin_CSDN的博客-CSDN博客


http://www.ppmy.cn/news/52597.html

相关文章

代码设计感悟-设计方案

设计出一个方案&#xff0c;中间肯定是有很多暂时无法解决的问题的&#xff0c;这样不必过分纠结&#xff0c;通过迭代的方式&#xff0c;暂缓一下&#xff0c;出去散散步喝喝茶&#xff0c;可能有新的角度新的方案。 除了迭代这个方式&#xff0c;还有分而治之的思路&#xff…

MySQL(表的内连和外连)

文章目录 0 准备1 内连接2 外连接2.1 左外连接2.1 右外连接 0 准备 相关内容已经准备好了~ 链接&#xff1a;https://gitee.com/ding-xushengyun/linux__cpp/blob/master/scott_data.sql 准备工作&#xff0c;创建一个雇员信息表&#xff08;来自oracle 9i的经典测试表&#…

Windows系统文件被faust勒索病毒加密勒索病毒解密恢复,电脑中病毒了怎么修复?

恶意软件的攻击已经让电脑用户变得更加谨慎了。在最近的一波攻击中&#xff0c;faust勒索病毒已经对使用Windows系统的计算机造成了广泛的破坏。该病毒利用加密技术锁定用户的文件&#xff0c;只有在支付一定数额的赎金后才会解锁这些文件。如果你的计算机中也受到了这种勒索病…

【GDOUCTF2023】wp

【GDOUCTF2023】 WEB hate eat snake js小游戏&#xff0c;玩游戏得到flag&#xff0c;修改一下js源码 EZ WEB 访问 /super-secret-route-nobody-will-guess 发送PUT请求&#xff1a; 受不了一点 <?php error_reporting(0); header("Content-type:text/html;char…

Word如何插入图片?最全方法总结(2023新版)

案例&#xff1a;Word如何插入图片 【我最近在写毕业论文&#xff0c;需要在Word文档里添加一些图片&#xff0c;想问问大家Word如何插入图片呀&#xff1f;感谢回答&#xff01;】 Microsoft Word是一个广泛使用的文字处理软件&#xff0c;在使用中如果插入图片可以很好的丰…

大数据技术之Kafka集成

一、集成Flume 1.1 Flume生产者 &#xff08;1&#xff09;启动Kafka集群 zkServer.sh startnohup kafka-server-start.sh /opt/soft/kafka212/config/server.properties & &#xff08;2&#xff09;启动Kafka消费者 kafka-console-consumer.sh --bootstrap-server 192…

Allegro PCB后处理和生产文件导出

Allegro PCB后处理&#xff0c;主要是完成线路设计以后&#xff0c;输出生产文件之前的处理。部分是看教程做的记录&#xff0c;方便以后自己参考。 教程&#xff1a; [小哥Cadence Allegro 132讲字幕版PCB视频教程]_哔哩哔哩_bilibili 感觉关键是多看右边Options菜单&#xf…

10个必须掌握的SQL常用语句

世界上70%的相关性数据可以被储存为表格数据&#xff0c;即类似Excel&#xff0c;Csv类型的数据&#xff0c;如何去查询和分析相关性的数据&#xff1f;对于少量数据&#xff0c;我们可以使用Excel&#xff0c;更多一点数据&#xff0c;我们可以使用Python, pandas 处理大数据 …