简短答案
是,但不容易。
详细信息,
我知道在请求到达控制器中的处理程序方法之前,可以更改请求主体的三个选项。
- 在调用方法之前,请使用AOP更改请求。
- 创建一个HTTP过滤器。
- 创建一个自定义的Spring HandlerInterceptor。
由于您已经在使用spring-boot,因此选项3(自定义Spring HandlerInterceptor)对您来说似乎是最佳选择。
这里是指向Baeldung文章的链接,该文章涵盖了springHandlerInterceptors。
Baeldung文章不是您问题的完整答案,因为您只能一次阅读
InputStrem返回的内容
HttpServletRequest。
您将需要创建一个包装器类,以扩展
HttpServletRequest
和包装您的包装器类中的每个请求,这些包装器类位于您的自定义HandlerInterceptor或自定义的Filter(过滤器可能是这里的方法)中。
包装类
HttpServletRequest
在包装器类构造函数中读取InputStream- 根据您的要求修改车身。
- 将修改后的主体写入
ByteArrayOutputStream
。 - 用于从流中
toByteArray
检索实际值byte[]
。 - 关闭ByteArrayOutputStream(try-with-resources对此很有用)。
- 覆盖
getInputStream
方法。 byte[]
每次getInputStream
调用时,将包裹在ByteArrayInputStream中。返回此流。
如何包装请求
- 在您的Filter中,实例化包装器类并传递原始请求(这是doFilter方法的参数)。
- 将包装传递给chain.doFilter方法(不是原始请求)。



