SpringBoot 拦截器获取http请求参数—— 所有骚操作基础
目录
SpringBoot 拦截器获取http请求参数—— 所有骚操作基础
获取http请求参数是一种刚需
定义拦截器获取请求
为什么拦截器会重复调两遍呢?
ServletInputStream(CoyoteInputStream) 输入流无法重复调用
自定义 HttpServletRequestWrapper
总结一下 展望一下
获取http请求参数是一种刚需
我想有的小伙伴肯定有过获取http请求的需要,比如想
1、 前置获取参数,统计请求数据
2、 做服务的接口签名校验
3、 敏感接口监控日志
4、 敏感接口防重复提交
等等各式各样的场景,这时你就需要获取 HTTP 请求的参数或者请求body,一般思路有两种,一种就是自定义个AOP去拦截目标方法,第二种就是使用拦截器。整体比较来说,使用拦截器更灵活些,因为每个接口的请求参数定义不同,使用AOP很难细粒度的获取到变量参数,本文主线是采用拦截器来获取HTTP请求。
定义拦截器获取请求
基于 spring-boot-starter-parent 2.1.9.RELEASE
看起来这个很简单,这里就直接上code,定义个拦截器
/**
* @author axin
* @summary HTTP请求拦截器
*/
@Slf4j
public class RequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求参数
String queryString = request.getQueryString();
log.info("请求参数:{}", queryString);
//获取请求body
byte[] bodyBytes = StreamUtils.copyToByteArray(request.getInputStream());
String body = new String(bodyBytes, request.getCharacterEncoding());
log.info("请求体:{}", body);
return true;
}
}
然后