前言
很多文章解释这个问题的是,说是SpringMVC自己用的InputStream没有实现reset()方法,而JDK大部分自带InputStream实现了这个方法,所以可以让InputStream重复读取,但是在笔者仔细了解后,发现实质上不是reset()的问题。
背景
在进行为公司开发接口验签,想在controller前就拿到数据进行验签时,出现了到达controller拿到的body为空的问题,网络上大部分文章千篇一律,都说了是InputStream的read方法只能读取一次的问题,在笔者debug后,逐层分析,写下这篇文章。
分析过程
1. 在进入controller层前拿出输入流的问题
因为SpringMVC框架中,最后是由DispatcherServlet进行请求分发,再走到相应的RequestMapping对应的方法,所以在filter中拿出数据,就能模拟出controller前拿出数据的方法。
首先写一个Filter,并在启动类上配置@ServletComponentScan
注解扫描servlet系列组件
/**
* @author kiring
* @date 2020/3/1 1:11
*/
@WebFilter(urlPatterns = "/*")
public class RequestBufferedFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if(servletRequest instanceof HttpServletRequest){
byte[] bytes = new byte[1024];
// InputStream被封装进request中,所以我们也要从request拿到这个inputstream
servletRequest.getInputStream().read(bytes);
System.out.println(new String(bytes,"utf-8"));
filterChain.doFilter("过滤器拿到请求数据:" + servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
当我们调用POST请求时,(为什么是POST请求,因为除了文件传输等请求,POST的requestBody数据是以InputStream进行传输的,其他数据可以从url上拿到并封装在request中,通过POST请求可以验证inputstream拿出数据的结果)
控