需求:request的content-type为applciation/json,进入controller之前需要把body中的参数取出来做一次处理,然后和hearder中的另一个参数做对比。
思路:加一个过滤器,在过滤器中取出参数做处理,然后比较
注意:body里的数据用流来读取,只能读取一次
HttpServletRequest的输入流只能读取一次的原因
我们先来看看为什么HttpServletRequest的输入流只能读一次,当我们调用getInputStream()方法获取输入流时得到的是一个InputStream对象,而实际类型是ServletInputStream,它继承于InputStream。
InputStream的read()方法内部有一个postion,标志当前流被读取到的位置,每读取一次,该标志就会移动一次,如果读到最后,read()会返回-1,表示已经读取完了。如果想要重新读取则需要调用reset()方法,position就会移动到上次调用mark的位置,mark默认是0,所以就能从头再读了。调用reset()方法的前提是已经重写了reset()方法,当然能否reset也是有条件的,它取决于markSupported()方法是否返回true。
InputStream默认不实现reset(),并且markSupported()默认也是返回false,这一点查看其源码便知:
我们再来看看ServletInputStream,可以看到该类没有重写mark(),reset()以及markSupported()方法:
综上,InputStream默认不实现reset的相关方法,而Servle

本文探讨了为什么HttpServletRequest的输入流只能读取一次的原因,由于ServletInputStream未重写reset方法,导致不能重复读取。为解决此问题,提出了一种通过自定义HttpServletRequestWrapper实现body数据缓存的方法,以便在Springboot过滤器中多次读取request body。同时,介绍了在Springboot中设置过滤器的相关注解和配置。
最低0.47元/天 解锁文章
7329

被折叠的 条评论
为什么被折叠?



