java - 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();
参考这篇文章,尝试以这种方式提取主体的局限性是:
- 请求的内容类型必须是
x-www-form-urlencoded
- 方法类型必须是
POST
对于我正在构建的应用程序,我无法强制执行这些约束中的任何一个,因为调用来自我无法控制的异构来源。是否有某种方法可以覆盖此行为以允许提取默认情况下不支持的请求的正文?或者,是否有另一种方法来执行此任务?
PS我正在对身体进行日志记录+一些自定义处理。因此,此答案中提到的解决方案并没有太大帮助
解决方案
你试过日志吗?https://github.com/zalando/logbook与纯 Spring 一起工作。
他们的默认日志编写器看起来很有希望:https ://github.com/zalando/logbook/blob/main/logbook-core/src/main/java/org/zalando/logbook/DefaultHttpLogWriter.java
你可能只想扩展这个类来记录你想要的所有记录器。除了记录之外,您甚至可以对请求执行完全不同的操作。
推荐阅读
- c++ - 在 C++ 中构建二叉树后的分段错误
- laravel - Laravel 保存时有时会生成一个带有图片名称的文件夹
- python - Python3.4.0 windows 7 64位无法安装pip包
- python - `Conda` 打包:以 `conda-forge` 作为我的优先渠道构建包,但用户在安装时会得到相同的包
- mongodb - 无权创建数据库
- xpath - XSLT - 添加多个包含 $ 符号的 xml 元素值
- python - 在 python 中下载带有 URL 的图像:gaierror
- regex - 在条件格式中使用自定义公式突出显示单个单元格中包含逗号分隔列表中的字符串的单元格
- api - 我应该在查询我的 WebAPI 端点之前添加一个斜杠吗?
- c++ - MySQL 一张表必须至少有一列