5
回答
springMVC 拦截器 @RequestBody BufferedReader
开发十年,就只剩下这套Java开发体系了   

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



举报
共有5个答案 最后回答: 3年前
流读取了就没了。
--- 共有 2 条评论 ---
凉粉回复 @打哭你 :流对应的是数据,数据放在内存中,有的是部分放在内存中。read 一次标记一次当前位置(mark position),第二次read就从标记位置继续读(从内存中copy)数据。 所以这就是为什么读了一次第二次是空了。 怎么让它不为空呢?只要inputstream 中的pos 变成0就可以重写读取当前内存中的数据,但很遗憾,没找到有修改pos 的api。 3年前 回复
努力学的程序员好像是这样的.....这是为什么呢?百度也搜索不到相关内容 3年前 回复
我的用json数据作为请求数据。接收的时候用@RequestParam Map<String ,Object > map   直接接收
--- 共有 1 条评论 ---
努力学的程序员嗯嗯....用@RequestBody好像流读取....读一次就没有了....貌似这样... 3年前 回复

 有一种方式做验证就是通过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再进行校验和处理即可
顶部