首页 > 解决方案 > ContentCachingRequestWrapper 仅捕获带有 Content-Type:application/x-www-form-urlencoded 的 POST 请求

问题描述

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

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

参考这篇文章,尝试以这种方式提取主体的局限性是:

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

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

PS我正在对身体进行日志记录+一些自定义处理。因此,此答案中提到的解决方案并没有太大帮助

标签: javaspringspring-mvcservlets

解决方案


你试过日志吗?https://github.com/zalando/logbook与纯 Spring 一起工作。

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

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


推荐阅读