我在运行 Spring Boot 应用程序时遇到了类似的问题。我的 Spring Boot 应用程序很简单Dispatcher
读取请求正文并处理它的 servlet。
就我而言,客户(curl
) 如果curl命令行使用,则设置application/x-www-form-urlencoded的内容类型标头-d {some-data}
并且不通过设置特定的内容类型标头-Hcontent-type=some-other-media-type
.
在 Spring Boot 运行的 Apache Catalina servlet 引擎内部,Request
班级进行以下测试parseParameters()
if (!("application/x-www-form-urlencoded".equals(contentType))) {
success = true;
return;
}
对于他人content-type
价值观,Request
返回这里,完成。
但是,如果内容类型matches application/x-www-form-urlencoded
, Request
继续:
try {
if (readPostBody(formData, len) != len) {
parameters.setParseFailedReason(FailReason.REQUEST_BODY_INCOMPLETE);
return;
}
} catch (....)
这将消耗身体。所以就我而言,即使myservlet 除了调用之外什么也不做request.getInputStream()
并尝试read()
从它开始,已经太晚了 - 运行时Request
已经读取输入并且不会缓冲或未读取它。唯一的解决方法是设置不同的Content-Type
.
罪魁祸首是OrderedHiddenHttpMethodFilter(HiddenHttpMethodFilter).doFilterInternal(HttpServletRequest, HttpServletResponse, FilterChain)
70号线
正在寻找"_method"
查询参数。
我可以通过添加来禁用过滤器
@Bean
public FilterRegistrationBean registration(HiddenHttpMethodFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
(用于解决另一个问题 https://stackoverflow.com/questions/32288910/spring-mvc-controller-method-mapping-using-form-body)