在Springboot程序啟動后,會默認添加OrderedCharacterEncodingFilter和HiddenHttpMethodFilter過濾器。在HiddenHttpMethodFilter過濾器中會調用request.getParameter(),從而造成我們在controller中通過request的InputStream無法讀取到RequestBody的數據。如下:
如果我們讀取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造成暫時無法衡量的影響(*^_^*);最大的問題是要多寫很多代碼啊!