Springboot中拦截GET请求获取请求参数验证合法性核心方法

 更新时间:2023年08月11日 09:37:54   作者:想养一只!  
这篇文章主要介绍了Springboot中拦截GET请求获取请求参数验证合法性,在Springboot中创建拦截器拦截所有GET类型请求,获取请求参数验证内容合法性防止SQL注入,这种方法适用拦截get类型请求,需要的朋友可以参考下

目的

在Springboot中创建拦截器拦截所有GET类型请求,获取请求参数验证内容合法性防止SQL注入(该方法仅适用拦截GET类型请求,POST类型请求参数是在body中,所以下面方法不适用)。

核心方法

1、拦截 http://127.0.0.1:8088/api/checkTechCertInfoCancel?name=ljh 类型:

Map<String, String[]> parameterMap = request.getParameterMap();

2、拦截http://127.0.0.1:8088/api/checkTechCertInfoCancel/ljh 类型:

Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

完整代码

创建拦截器

import com.alibaba.fastjson.JSON;
import com.boc.ljh.utils.Result;
import com.boc.ljh.utils.status.AppErrorCode;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @Author: ljh
* @ClassName SqlInterceptor
* @Description 拦截器 用于拦截GET请求校验参数内容
* @date 2023/8/9 10:12
* @Version 1.0
*/
@Component
public class SqlInterceptor implements HandlerInterceptor {
/**
* @Author: ljh
* @Description: 在controller前拦截请求
* @DateTime: 10:38 2023/8/9
* @Params:
* @Return
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.err.println(request.getMethod());
if (request.getMethod().equals("GET") && request.getRequestURI().contains("?")) {
//获取EGT请求中的参数,例如http://127.0.0.1:8088/api/checkTechCertInfoCancel?name=ljh 请求中的参数ljh
Map<String, String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
String[] value = entry.getValue();
for (String s : value) {
//校验参数值是否合法
if (verifySql(s)) {
response.setContentType("application/json;charset=utf-8");
Result result = new Result();
result.setMessage("请求参数中含有非法字符!请检查重新输入");
result.setStatus(500);
response.getWriter().write(JSON.toJSONString(result));
return false;
}
}
}
} else {
//获取EGT请求中的参数,例如http://127.0.0.1:8088/api/checkTechCertInfoCancel/ljh 请求中的参数ljh
Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
for (String key : pathVariables.keySet()) {
//校验参数值是否合法
if (verifySql(pathVariables.get(key))) {
//返回错误提示
response.setContentType("application/json;charset=utf-8");
Result result = new Result();
result.setMessage("请求参数中含有非法字符!请检查重新输入");
result.setStatus(500);
response.getWriter().write(JSON.toJSONString(result));
return false;
}
}
}
return true;
}
//处理请求完成后视图渲染之前的处理操作
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
//视图渲染之后的操作
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
/**
* @Author: ljh
* @Description: 校验非法字符
* @DateTime: 11:15 2023/8/9
* @Params:
* @Return
*/
public boolean verifySql(String parameter) {
String s = parameter.toLowerCase();
// 过滤掉的sql关键字,特殊字符前面需要加\\进行转义
String badStr =
"select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|" +
"char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" +
"information_schema.columns|table_schema|union|where|order|by|" +
"'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";
//使用正则表达式进行匹配
boolean matches = s.matches(badStr);
return matches;
}

注册拦截器

/**
* @Author: ljh
* @ClassName MvcInterceptorConfig
* @Description 注册SqlInterceptor拦截器到容器中
* @date 2023/8/9 10:21
* @Version 1.0
*/
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcInterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SqlInterceptor()) //需要注册到容器中的拦截器
.addPathPatterns("/**"); //所有请求都被拦截,静态资源也被拦截
//                .excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/images/**", "/js/**"); // 放行的请求
}
}

测试效果

请求内容合法:

请求内容不合法:

Springboot中使用过滤器校验PSOT类型请求参数内容

到此这篇关于Springboot中拦截GET请求获取请求参数验证合法性的文章就介绍到这了,更多相关Springboot拦截GET请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现异步事件Event详解

    SpringBoot实现异步事件Event详解

    这篇文章主要介绍了SpringBoot实现异步事件Event详解,异步事件的模式,通常将一些非主要的业务放在监听器中执行,因为监听器中存在失败的风险,所以使用的时候需要注意,需要的朋友可以参考下
    2023-11-11
  • java.Net.UnknownHostException异常处理问题解决

    java.Net.UnknownHostException异常处理问题解决

    这篇文章主要介绍了java.Net.UnknownHostException异常处理方法,问题原因是在系统的 /etc/Hostname中配置了主机名,而在/etc/hosts文件中没有相应的配置,本文给大家详细讲解,需要的朋友可以参考下
    2023-03-03
  • 深入分析:用1K内存实现高效I/O的RandomAccessFile类的详解

    深入分析:用1K内存实现高效I/O的RandomAccessFile类的详解

    本篇文章是对用1K内存实现高效I/O的RandomAccessFile类的详细分析介绍,需要的朋友参考下
    2013-05-05
  • java中文分词之正向最大匹配法实例代码

    java中文分词之正向最大匹配法实例代码

    中文分词应用很广泛,网上也有很多开源项目,下面这篇文章主要给大家介绍了关于java中文分词之正向最大匹配法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • 在Java8与Java7中HashMap源码实现的对比

    在Java8与Java7中HashMap源码实现的对比

    这篇文章主要介绍了在Java8与Java7中HashMap源码实现的对比,内容包括HashMap 的原理简单介绍、结合源码在Java7中是如何解决hash冲突的以及优缺点,结合源码以及在Java8中如何解决hash冲突,balance tree相关源码介绍,需要的朋友可以参考借鉴。
    2017-01-01
  • SpringBoot2整合ElasticJob框架过程详解

    SpringBoot2整合ElasticJob框架过程详解

    这篇文章主要介绍了SpringBoot2整合ElasticJob框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java8中Optional的一些常见错误用法总结

    Java8中Optional的一些常见错误用法总结

    我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional,下面这篇文章主要给大家介绍了关于Java8中Optional的一些常见错误用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • Java设计模式之代理模式_动力节点Java学院整理

    Java设计模式之代理模式_动力节点Java学院整理

    这篇文章主要介绍了Java设计模式之代理模式,本文详细的介绍了什么事代理模式和相关的类和接口,有兴趣的可以了解一下
    2017-08-08
  • SQL Server 2000 Driver for JDBC Service Pack 3 安装测试方法

    SQL Server 2000 Driver for JDBC Service Pack 3 安装测试方法

    这篇文章主要介绍了数据库连接测试程序(SQL Server 2000 Driver for JDBC Service Pack 3 安装测试),需要的朋友可以参考下
    2014-10-10
  • springboot项目开启https协议的项目实现

    springboot项目开启https协议的项目实现

    本文主要介绍了springboot项目开启https协议的项目实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论