controller 无法拿到request流数据

一般我们会在Interceptor拦截器中对请求的token进行验证

而我们的接口是用@RequestBody来接受数据,那么我们在拦截器中验证token时

需要读取request的输入流  ,因为 ServletRequest中getReader()和getInputStream()只能调用一次

这样就会导致到controller 无法拿到数据。

这种情况,应该怎么处理?


评论区

JFinal

2017-10-27 15:44

只要拿到 reader 与 inputStream 后,不去 close() 掉它,是可以多次去拿这些对象的,你试试

mekain

2017-10-27 16:22

@JFinal 我没有close,但是到Controller就没有得到流的内容了。

public static String getParam(HttpServletRequest request) {
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
try {
for (int n; (n = request.getInputStream().read(b)) != -1;) {
out.append(new String(b, 0, n));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return out.toString();
}

JFinal

2017-10-28 14:30

@mekain 数据确实只能获取一次,因为流里面的数据读的时候,指针会往后不断移动,那么,你要处理于读过的数据在后续共享的事情

例如,可以通过 request.setAttribute(...) 或者 controller.setAttr(...) 将数据传递下去,也可以在 controller 中用一个属性来存放,例如 this.data = ...;