Request body二次取得的问题

HttpServletRequest中的取得body的方法有两种:getInputStream()、getReader()。

但是这个两个方法只能用一次,取第二次的时候就会变为null,然而HttpServletRequest中的body二进制还是有的,感觉特别奇怪,原因可能是游标的变动,HttpServletRequest第一次取body时游标以跑到二进制流的尾部,然后第二次去的时候就取不到了,解决方法如下:


重写HttpServletRequestWrapper


public class BodyReaderHttpServletRequestWrapper extends
HttpServletRequestWrapper {


private byte[] body;


public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
String charset = request.getCharacterEncoding();
if (StringUtils.isNullOrEmpty(charset)) {
charset = "utf-8";
}
try {
body = StreamUtil.readBytes(request.getReader(), charset);
} catch (IOException e) {
e.printStackTrace();
}
}


@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}


@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() {


@Override
public int read() throws IOException {
return bais.read();
}


@Override
public boolean isFinished() {
return false;
}


@Override
public boolean isReady() {
return false;
}


@Override
public void setReadListener(ReadListener readListener) {

}


};
}

然后  ServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest);


之后用requestWrapper就可随便去body值了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值