zoukankan      html  css  js  c++  java
  • 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造成暂时无法衡量的影响(*^_^*);最大的问题是要多写很多代码啊!

  • 相关阅读:
    jqGrid表格控件的学习
    list 集合筛选数据
    MySQL跨域
    11-Index页面
    11-Comment页面
    11-Add页面
    11-UploadFile
    11-控制器UI
    11-控制器
    11-数据访问层
  • 原文地址:https://www.cnblogs.com/dw039/p/9445703.html
Copyright © 2011-2022 走看看