【问题标题】:ContentCachingRequestWrapper only captures POST request with Content-Type:application/x-www-form-urlencodedContentCachingRequestWrapper 仅捕获带有 Content-Type:application/x-www-form-urlencoded 的 POST 请求
【发布时间】:2021-01-24 16:15:13
【问题描述】:

我正在尝试拦截所有传入的 HTTP 请求并在我的 Spring MVC(不是 Spring Boot)应用程序中处理附加到这些请求的主体。为了实现这个“入站拦截器”,我使用了 Spring 的 HandlerInterceptor 接口。一旦请求被拦截,我将尝试按如下方式检索正文:

ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
Map<String, String[]> params = requestWrapper.getParameterMap();
byte[] body = requestWrapper.getContentAsByteArray();

参考这个article,尝试这种方式提取body的局限性是:

  1. 请求的内容类型必须是x-www-form-urlencoded
  2. 方法类型必须是POST

对于我正在构建的应用程序,我无法强制执行这些约束中的任何一个,因为调用来自我无法控制的异构来源。是否有某种方法可以覆盖此行为以允许提取默认情况下不支持的请求的正文?或者,是否有另一种方法来执行此任务?

附:我正在对身体进行日志记录+一些自定义处理。所以this answer中提到的解决方案并没有太大帮助

【问题讨论】:

  • “处理”是什么意思?你想在 Spring MVC 处理这个改变的 body 之前改变 body 吗?
  • @SvenDöring 身体没有变化。我有几个正在尝试使用的自定义日志记录类。

标签: java spring spring-mvc servlets


【解决方案1】:

您尝试过日志吗? https://github.com/zalando/logbook 与纯 Spring 配合使用。

他们的默认日志编写器看起来很有前途:https://github.com/zalando/logbook/blob/main/logbook-core/src/main/java/org/zalando/logbook/DefaultHttpLogWriter.java

您可能只想扩展此类以记录到所有您想要的记录器。 除了记录之外,您甚至可以对请求执行完全不同的操作。

【讨论】:

  • 感谢您的建议,将试一试。虽然现在,我发现 OncePerRequestFilterContentCachingWrappers 的组合可以很好地捕获请求 (github.com/taabishm2/Spring-Inbound-Interceptor) 所需的所有内容,而无需使用任何专用库
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2017-09-26
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多