SpringBoot Controller 中 HttpServletRequest ServletInputStream 读取不到数据该怎么处理

时间:2024-04-20 13:07:15

在Springboot程序启动后,会默认添加OrderedCharacterEncodingFilter和HiddenHttpMethodFilter过滤器。在HiddenHttpMethodFilter过滤器中会调用request.getParameter(),从而造成我们在controller中通过request的InputStream无法读取到RequestBody的数据。如下:

SpringBoot Controller 中 HttpServletRequest ServletInputStream 读取不到数据该怎么处理

如果我们读取RequestBody的字节数据该怎么办呢?这里介绍2种处理方式,推荐第一种方式:

一、使用@RequestBody注解

@RestController
@RequestMapping(value = "dtu")
public class HomeController {
public static String InputData;
public static SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); @PostMapping("/post")
public void post(@RequestBody byte[] data) {
InputData = "POST收到数据的时间:" +
format.format(new Date()) +
"<br />**********收到的数据**********<br />" +
new String(data, 0, data.length, Charset.forName("UTF-8"));
}
}

注意:亲测 @RequestBody 无法读取 multipart/form-data 格式的表单数据

二、修改HiddenHttpMethodFilter

既然HiddenHttpMethodFilter造成了InputStream在进入Controller之前被读取,自然可以通过修改HiddenHttpMethodFilter来避免这种情况。添加springboot 配置文件,修改注入springboot的 HiddenHttpMethodFilter bean。

@Configuration
public class WebConfig {
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter(){
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
filterChain.doFilter(request, response);
}
};
}
}

第二种修改方式标本兼治,但是它侵入式的修改影响了springboot框架默认配置,也会对非必需读取RequestBody数据的Controller造成暂时无法衡量的影响(*^_^*);最大的问题是要多写很多代码啊!