博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpServletRequest.getInputStream() 只能读取一次
阅读量:5733 次
发布时间:2019-06-18

本文共 2160 字,大约阅读时间需要 7 分钟。

问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据
 
原因
1. 一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1;
2. InputStream并没有实现reset方法(可以重置首次读取的位置),无法实现重置操作;
 
解决方法(缓存读取到的数据)
1.使用request、session等来缓存读取到的数据,这种方式很容易实现,只要setAttribute和getAttribute就行;
2.使用HttpServletRequestWrapper来包装HttpServletRequest,在MAPIHttpServletRequestWrapper中初始化读取request的InputStream数据,以byte[]形式缓存在其中,然后在Filter中将request转换为包装过的request;代码如下:
public class MAPIHttpServletRequestWrapper extends HttpServletRequestWrapper {        private final byte[] body; // 报文    public MAPIHttpServletRequestWrapper(HttpServletRequest request) throws IOException {        super(request);        body = StreamUtil.readBytes(request.getInputStream());    }        @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();            }        };    }}
/** * @author Perlin.Yao * @date 2014年8月22日 * @version 1.0 */public class HttpServletRequestReplacedFilter implements Filter {    @Override    public void destroy() {            }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        ServletRequest requestWrapper = null;          if(request instanceof HttpServletRequest) {              requestWrapper = new MAPIHttpServletRequestWrapper((HttpServletRequest) request);          }          if(requestWrapper == null) {              chain.doFilter(request, response);          } else {              chain.doFilter(requestWrapper, response);          }      }    @Override    public void init(FilterConfig arg0) throws ServletException {            }}

-----------------------------------------------------------

来源于:http://ayaoxinchao.iteye.com/blog/2110902

转载地址:http://kqlwx.baihongyu.com/

你可能感兴趣的文章
linux 参数内核
查看>>
使用Azcopy在Azure上进行HBase的冷热备份还原
查看>>
计组_定点数一位乘_布斯公式
查看>>
linux下使用过的命令总结(未整理完)
查看>>
ES6的一些文章
查看>>
LeetCode 198, 213 House Robber
查看>>
New Year Permutation(Floyd+并查集)
查看>>
Qt编写输入法V2018超级终结版
查看>>
<context:component-scan>详解
查看>>
DS博客作业07--查找
查看>>
[JOI2017] サッカー (Soccer)
查看>>
Git 方法
查看>>
[Python] numpy.nonzero
查看>>
2016-11-29
查看>>
C#反射的坑
查看>>
css3 box-shadow阴影(外阴影与外发光)讲解
查看>>
时间助理 时之助
查看>>
nginx快速安装
查看>>
自定义转场动画
查看>>
英国征召前黑客组建“网络兵团”
查看>>