前言
在Springboot
的项目中使用Servlet
的Filter
来实现方法签名时,发现请求的body
不支持多次读取。我是通过getInputStream()
来获取流,然后通过读取流来获取请求的body
。
虽然网上有很多解决方案的例子,但是我发现没有一篇文章解释为什么会这样的文章,所以决定自己去研究源码。
问题表现
Content-Type
为application/json
的POST
请求时,会返回状态码为400
的响应,响应的body
如下:
{
"timestamp": "2019-12-27T02:48:50.544+0000",
"status": 400,
"error": "Bad Request",
"message": "Required request body is missing: ...省略非关键信息...",
"path": "/"
}
而在日志中则有以下关键日志
2019-12-27 10:48:50.543 WARN 18352 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException:...省略非关键信息...
初步分析
根据提示信息可以得知,由于请求的body
没有了,所以才会抛出这个异常。但是为什么body
会没有了呢?是否因为通过getInputStream()
获取到的流被读取了所以引起这个问题呢?
复盘代码
于是我编写了一个复盘的示例,就是一个在日志中打印请求body
的Filter
,关键代码如下:
@Slf4j
@WebFilter
public class InputStreamFilter implements Filter {
@Overrid