小编典典

如何在Spring Boot中到达控制器之前修改请求主体

spring-boot

我有一个Spring Boot应用程序。我更改每个发布请求的请求正文。是否可以在请求到达控制器之前修改请求主体。请列举一个例子。


阅读 340

收藏
2020-05-30

共1个答案

小编典典

简短答案
是,但不容易。

详细信息,
我知道在请求到达控制器中的处理程序方法之前,可以更改请求主体的三个选项。

  1. 在调用方法之前,请使用AOP更改请求。
  2. 创建一个HTTP过滤器。
  3. 创建一个自定义的Spring HandlerInterceptor。

由于您已经在使用spring-boot,因此选项3(自定义Spring HandlerInterceptor)对您来说似乎是最佳选择。

这里是指向Baeldung文章的链接,该文章涵盖了springHandlerInterceptors。

Baeldung文章不是您问题的完整答案,因为您只能一次阅读InputStrem返回的内容HttpServletRequest

您将需要创建一个包装器类,以扩展HttpServletRequest
和包装您的包装器类中的每个请求,这些包装器类位于您的自定义HandlerInterceptor或自定义的Filter(过滤器可能是这里的方法)中。

包装类

  1. HttpServletRequest在包装器类构造函数中读取InputStream
  2. 根据您的要求修改车身。
  3. 将修改后的主体写入ByteArrayOutputStream
  4. 用于从流中toByteArray检索实际值byte[]
  5. 关闭ByteArrayOutputStream(try-with-resources对此很有用)。
  6. 覆盖getInputStream方法。
  7. byte[]每次getInputStream调用时,将包裹在ByteArrayInputStream中。返回此流。

如何包装请求

  1. 在您的Filter中,实例化包装器类并传递原始请求(这是doFilter方法的参数)。
  2. 将包装传递给chain.doFilter方法(不是原始请求)。
2020-05-30