当前位置: 首页 > 知识库问答 >
问题:

Zuul/DispatcherServlet损坏了包含多部分的PUT请求(删除了多部分数据)

伯英锐
2023-03-14

我们正在使用Zuul将请求转发到内部微服务。内部服务有两个endpoint(一个PUTendpoint和一个POSTendpoint)。我们发现,多部分请求在到达内部PUTendpoint之前就已损坏。

多部分数据似乎已从请求中删除。这似乎只适用于PUT请求,因为POST工作得很好。

如果我们使用cURL直接命中内部PUTendpoint,那么请求将得到正确处理。相应的cURL命令和请求主体如下所示:

curl -v -X PUT -H "Content-Type: multipart/form-data" -F "file=@/path/to/file.txt" "http://localhost:8081/file/put"

标题:

{user-agent=[curl/7.35.0], host=[localhost:8082],接受=[/], content-长度=[203],期望=[100-继续], content-type=[multipart/form-data;边界=------------------------c1efb86a9054e387]}

实体:

--------------------------c1efb86a9054e387内容配置:表单数据;name=“file”;filename=“helloworld.txt”内容类型:文本/普通

这是我的文件内容

--------------------------c1efb86a9054e387--

但是,如果我们尝试通过Zuul使用cURL命中PUTendpoint,则请求如下所示:

curl -X PUT -H "Content-Type: multipart/form-data" -F "file=@/path/to/file.txt" "http://localhost:8082/file/put"

标题:

{用户代理=[curl/7.35.0],接受=[/],预期=[100 continue],内容类型=[multipart/form data;boundary=hkBnDNXOcDTwkuL1qLhglF6i4NA2YREd],x-forwarded-host=[localhost:8081],x-forwarded-proto=[http],x-forwarded-prefix=[/file],x-forwarded-port=[8081],x-forward-for=[127.0.0.1],接受编码=[gzip],内容长度=[38],主机=[localhost:8082],连接=[Keep Alive]}

实体:

--HKBNDNXOCDTWKUL1QLHGLF6I4NA2年--

请注意,实体不完整。

我已将示例代码上载到此存储库:https://github.com/trcodestore/zuul-put-demo.存储库包含两个用于演示此问题的小项目。自述文件包含构建和运行指令。

我知道请求最初由Spring的DispatcherServlet处理,然后最终由ZuulServlet处理。我认为是DispatcherServlet导致了这个问题。我们可以通过在所有请求URI前面加上“/zuul”来绕过DispatcherServlet——这允许多部分请求直接转到ZuulServlet,然后按预期工作。然而,这并不是一个理想的解决方案。

如有任何建议,将不胜感激。谢谢

共有1个答案

郝杰
2023-03-14

好吧,我有解决办法(信用:穆罕默德·佐尔马吉德)。

Spring Boot使用Standard ServletMultipartResolver来处理多部分-它假设所有多部分请求都将与POST一起提交。

为了允许StandardServletMultipartResolver处理PUT请求,我们必须重写isMultiPart方法。我最终使用了以下配置:

@Bean
public MultipartResolver multipartResolver() {
   return new StandardServletMultipartResolver() {
     @Override
     public boolean isMultipart(HttpServletRequest request) {
        String method = request.getMethod().toLowerCase();
        if (!Arrays.asList("put", "post").contains(method)) {
           return false;
        }
        String contentType = request.getContentType();
        return (contentType != null &&contentType.toLowerCase().startsWith("multipart/"));
     }
   };
}
 类似资料:
  • 问题内容: 我正在编写一个RESTful API。我在使用不同的动词上载图像时遇到麻烦。 考虑: 我有一个对象,可以通过对URL的发布/放置/删除/获取请求来创建/修改/删除/查看。如果有要上载的文件,则请求是多部分形式;如果只有文本要处理,则请求是application / xml。 为了处理与对象相关的图像上传,我正在做类似的事情: 这里的主要问题是在尝试处理放置请求时,显然$ _POST不包

  • 问题内容: 我有一个API端点,必须向其发送多部分HTTP请求,该请求由两部分组成(文件系统文件)和(JSON对象)。 经过一些研究,我发现了如何在AngularJS中执行多部分请求: 1) 该函数最初具有以下形式: 此实现的结果是,请求的各个部分没有设置。 Blob ,对象看起来像这样(有点混乱,基本上第一部分是of ,第二个): 第二种方法为请求的每个部分设置了正确的内容,但没有为部分设置任何

  • 当我尝试上传一个文件和标题时,我得到以下异常。我正在将Content-Type头设置为multipart/form-data。 我如何在Spring Security后面做文件上传?这个请求似乎从未被转换成MultiPartHttpServerRequest,所以它不起作用? 如果更改方法签名以采用@RequestParam MultipartFile,则会出现如下异常: ...但我在XML中配置

  • 我试图发送一个帖子请求到一个php文件,该文件有帖子数据和文件上传,这里是我发送的内容,设置标题的代码,我有的php文件,以及我从php中得到的东西file:([图像文件内容]是我正在发送的图像文件二进制数据的占位符) 我的问题是_POST //我正在向服务器发送的数据: 对于我的标题,我有: php文件: php文件的结果:

  • 问题内容: 我正在尝试通过带有POST请求的照片上传 根据自述文件,我应该能够做到这一点 问题是,这不起作用。我收到测试服务器的回复,说它转储了0个post变量。 我已经确认该HTML小页面服务器处于工作状态 所以问题是,请求模块在做什么?有没有更好的方法来发送节点? 问题答案: 经过更多研究后,我决定使用。这使得分段上传非常容易。

  • 我正在尝试通过使用多部分数据主体的JMeter构建HTTP请求。 我有一个HTTP头管理器,其内容类型设置为多部分/表单数据;边界=AaB03x。我选择了“将多部分/表单数据用于POST”。 然后我创建了一个数据主体, 当我运行这个程序时,我发现请求没有正确地发送正文,而是发送了一些随机数据, 发布数据: 并给出错误响应, 我的第二个问题是:请求的第3部分发送一个要上载的文件。我可以通过某种方式传