springMVC 拦截器 @RequestBody BufferedReader

努力学的程序员 发布于 2015/10/29 15:12
阅读 3K+
收藏 0

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



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

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

为什么不用@RequestParam ?

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

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