欢迎光临
我们一直在努力

SpringMVC中在拦截器使用流读取参数后controller无法读取解决方案

今天出现这样一个问题:
现在开发的项目是基于SpringBoot的maven项目,有个需求就是要加一个拦截器和过滤器,在拦截器中我需要获取到前端传过来的json数据,按照常理来说,获取请求参数使用request.getParameter()方法就可以,但是不知道为什么在这个项目里面获取不到。这时候我想到了使用流的方法从request对象中直接读出来。
当然,方法写好后,在拦截器中也读取到了请求参数,但是出现一个问题。就是后面的controller中使用了@RequestBody注解获取参数,但是拦截器执行过后,controller获取不到参数,甚至是方法都没有进入对应的方法中就报错了(注:拦截器中不使用流,controller中是能获取到参数的)。
在debug过程中,发现拦截器使用流和不适用流到了一个获取字符集解析器的方法里面就有差别了。一个是能获取到字符集解析器。另一个获取不到。但是看了执行过程也没发现什么问题。就百度了一下,发现了Spring有一个问题就是: ServletRequest中getReader()和getInputStream()只能调用一次。而又由于@RequestBody注解获取输出参数的方式也是根据流的方式获取的。所以我们前面使用流获取后,后面的@RequestBody就获取不到对应的输入流了。
那么问题找到之后。想着解决。从网上查找了一下,有一个方法就是。先读取流,然后在将流写进去就行了,下面是我的一些解决代码:
过滤器:

在代码中我们可以看到我们为了方式流的丢失,我们新建了一个类的对象,注意filterChain.doFilter(requestWrapper, servletResponse);这句代码的requestWrapper参数,和原生的不一致哦,是我们处理过后的ServletRequest。下面是BodyReaderHttpServletRequestWrapper的实现:

代码逻辑大家可以自己看下,很简单的一个逻辑。
下面是我的拦截器获取参数代码:

赞(1) 打赏
未经允许不得转载:雨轩博客 » SpringMVC中在拦截器使用流读取参数后controller无法读取解决方案
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏