API请求报错:Required request body is missing(缺少必需的请求正文)

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中用户信息的方式(这里可以参考该博主的文章:增加过滤器保存流
使用过滤器保存流,且使用拦截器获取流的解决方案示意图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值