在 multipart/form-data 情况下,无法多次读取 HttpServletRequest 的请求正文

问题描述 投票:0回答:1

我知道有很多例子可以多次读取请求正文,我已经经历了很多,但找不到解决我的问题的方法。

所以,就我而言,我有一个 spring-boot 项目,它将文件上传到 Amazon s3。我想读取我在 servlet-filter 中上传的任何文件的请求正文。

我尝试了以下包装

  1. https://github.com/isapir/servlet-filter-utils
  2. 内容缓存请求包装器
  3. https://gitlab.com/jamietanna/multiple-read-servlet/-/blob/master/src/main/java/me/jvt/multireadservlet/MultiReadHttpServletRequest.java

a)对于第一个和第二个,如果是多部分/表单数据,我会得到空请求正文。

b) 对于第二个,如果我调用

requestWrapper.getParameterMap()
进行缓存,我仍然得到空的请求正文。

c)对于第一个,如果我调用

requestWrapper.getParameterMap()
进行缓存,我会得到请求正文,但请求不会执行并导致错误请求。

以下是例外情况:

Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present]

d)对于第三种情况,在多部分/表单数据的情况下,我也会得到与上述相同的异常,通常它工作正常(如果有其他请求)。

编辑:我也浏览了BalusC文章(1)(2),但得到了同样的异常。 我发现我必须在自定义 requestWrapper 中实现我自己的

getPart(String part)
getPart()
才能处理这个多部分/表单数据请求。 我没有找到
getParts()
getPart(String part)
的任何参考实现。

我被困住了,请帮忙!!!

java spring amazon-s3 content-type servlet-filters
1个回答
0
投票

如果您使用的是 Spring Boot 2.2 或以上版本。那么这个问题就来了。其实他们已经禁用了

HttpHiddenMethodFilter 默认禁用处理 _method 请求参数的过滤器现在默认禁用,因为如果请求正文可能包含参数,它会导致请求正文过早被消耗。这可以通过设置

来恢复
spring.webflux.hiddenmethod.filter.enabled

spring.mvc.hiddenmethod.filter.enabled

为真。

因此添加任何这些道具都可以工作

#spring.webflux.hiddenmethod.filter.enabled=true

spring.mvc.hiddenmethod.filter.enabled=true

© www.soinside.com 2019 - 2024. All rights reserved.