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

  • 相关阅读:
    spring boot三种方式设置跨域
    完整卸载Mysql
    【OBIEE】OBIEE集成Echarts作图
    【OBIEE】BIEE培训(一)
    【Oracle】Oracle物化视图
    【Oracle】oracle11g安装过程提示swap size 检查失败问题
    【Linux】centOS7下安装GUI图形界面
    【Nginx】Linux环境搭建nginx负载
    【oracle】Oracle创建带参数视图
    抢票:搭建github最火的12306项目
  • 原文地址:https://www.cnblogs.com/dw039/p/9445703.html
Copyright © 2020-2023  润新知