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

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

 

 

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

1、使用@RequestBody注解app

@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 格式的表单数据框架

2、修改HiddenHttpMethodFilteride

既然HiddenHttpMethodFilter形成了InputStream在进入Controller以前被读取,天然能够经过修改HiddenHttpMethodFilter来避免这种状况。添加springboot 配置文件,修改注入springboot的 HiddenHttpMethodFilter bean。post

@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形成暂时没法衡量的影响(*^_^*);最大的问题是要多写不少代码啊!spa

相关文章
相关标签/搜索