开发者社区> 问答> 正文

springMVC 拦截器 @RequestBody BufferedReader? 400 报错

springMVC 拦截器 @RequestBody BufferedReader? 400 报错

spring MVC controller 中用@RequestBody注解获取json字符串。想加一层拦截器,对请求进行参数验证,于是写了一个拦截器,用BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));这样的方式来取得请求内容,但是进行br.readline()操作之后,当方法进入controller时,@RequestBody String json ,json就为空...不是null,是空着的....求原因,最好能提供解决方法。谢谢了。下面是具体代码贴图。



展开
收起
爱吃鱼的程序员 2020-05-29 17:55:31 468 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    流读取了就没了。######回复 @打哭你 :流对应的是数据,数据放在内存中,有的是部分放在内存中。read 一次标记一次当前位置(mark position),第二次read就从标记位置继续读(从内存中copy)数据。 所以这就是为什么读了一次第二次是空了。 怎么让它不为空呢?只要inputstream 中的pos 变成0就可以重写读取当前内存中的数据,但很遗憾,没找到有修改pos 的api。######好像是这样的.....这是为什么呢?百度也搜索不到相关内容######

    把拦截器去掉能接收到吗?   

    为什么不用@RequestParam ?

    ######json请求.....没用br.read()这个操作就可以接收到...######我的用json数据作为请求数据。接收的时候用@RequestParam Map<String ,Object > map   直接接收######嗯嗯....用@RequestBody好像流读取....读一次就没有了....貌似这样...######既然你用了spring MVC要做数据处理,就利用它的 HttpMessageConverter吧,不要写那种拦截器了。######

     有一种方式做验证就是通过Aop,对controller的方法做切面。

    在切面里面可以拿到方法的参数,

    @Around("  ****   ") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable

    ProceedingJoinPoint pjp

    Object[] args = pjp.getArgs();
    通过

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();
    可以拿到当前线程使用的request和response再进行校验和处理即可
    2020-05-29 17:55:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载