在Springboot程序啓動後,會默認添加OrderedCharacterEncodingFilter和HiddenHttpMethodFilter過濾器。在HiddenHttpMethodFilter過濾器中會調用request.getParameter(),從而形成咱們在controller中經過request的InputStream沒法讀取到RequestBody的數據。以下:html
若是咱們讀取RequestBody的字節數據該怎麼辦呢?這裏介紹2種處理方式,推薦第一種方式:spring
1、使用@RequestBody註解springboot
@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 格式的表單數據app
2、修改HiddenHttpMethodFilter框架
既然HiddenHttpMethodFilter形成了InputStream在進入Controller以前被讀取,天然能夠經過修改HiddenHttpMethodFilter來避免這種狀況。添加springboot 配置文件,修改注入springboot的 HiddenHttpMethodFilter bean。ide
@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形成暫時沒法衡量的影響(*^_^*);最大的問題是要多寫不少代碼啊!post