SpringBoot Controller 中 HttpServletRequest ServletInputStream 讀取不到數據該怎么處理


在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造成暫時無法衡量的影響(*^_^*);最大的問題是要多寫很多代碼啊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM