Request中的InputStream只能读取一次的问题
拦截器中通过流 request.getInputStream()的方式读取body中传来的数据会导致controller接收不到值。
ps:在查看了一些InputStream可以重复读的方法,其实大多数都讲到了,但是没有讲全,原因和结尾没有说到,原本想复制粘贴完事,结果发现不行,还得自琢磨一下
问题的本质是InputStream读取完后指针已经到了内容的结尾,对象还是原来的对象,你再次读取的时候从最后开始读取,所以肯定是null
解决办法
- 让指针读完后回到原来的起始点
- 利用对象的思想将流的内容保存起来
1. 让指针读完后回到原来的起始点:利用mark做标记和reset回到标记点
由于mark和reset方法只能在BufferedInputStream中使用,在此不适用这个方法,不能直接用mark和reset
2. 利用对象的思想将流的内容保存起来:继承HttpServletRequestWrapper,替换请求过来的Request对象。
所以我们有:
public class RequestWrapper extends HttpServletRequestWrapper {
private static final Logger