1.请求API出现Required request body is missing问题的原因:
由于需要对系统的登录接口做IP登录失败次数限制或者用户登录失败限制,在拦截器中直接通过HttpServletRequest.getInputStream()获取Request中的用户信息(inputstream只可以读取一次),当在拦截器中读取了一次Request之后,在登录接口中再次读取Request,就会报错:Required request body is missing。
报错示意图:
2.为什么inputStream只可以读取一次?
InputStream read方法内部会记录position,用于记录当前流读取到的位置,若已读完,read方法会返回-1,(经常和inputStream打交道的,应该都会while(read() != -1) ,用这种方式读取inputStream)。若读取完再次读取的话可以调用inputStream.reset方法,此方法的前提是此方法markSupported返回true。HttpServletRequest使用的是ServletInputStream,看源码可知ServletInputStream没有实现reset和markSupported方法,那么ServletInputStream无法reset之后再次读取,所以inputStream只可以读取一次!(可以参考该博主的文章:为什么inputStream只可以读取一次)
3.解决方法:
增加过滤器保存流,增加Body封装类,用来保存requestBody,且需要修改拦截器中的获取Request中用户信息的方式(这里可以参考该博主的文章:增加过滤器保存流)
使用过滤器保存流,且使用拦截器获取流的解决方案示意图: