ServletInputStream的重复读取(多次读取)
2017-05-24 11:11
986 查看
欢迎和大家交流技术相关问题:
邮箱: jiangxinnju@163.com
博客园地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnju
在使用Servlet进行Web开发的时候,有时候为了增加必要的业务处理而又不想修改现有的程序,往往采用Filter。这样在各个Filter中可能都要读取ServletInputStream流的内容,而ServletInputStream却只能读一次,这时候必须备份HttpServleRequest。
在Filter的doFilter()或者Servlet的doPost()中,
邮箱: jiangxinnju@163.com
博客园地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnju
在使用Servlet进行Web开发的时候,有时候为了增加必要的业务处理而又不想修改现有的程序,往往采用Filter。这样在各个Filter中可能都要读取ServletInputStream流的内容,而ServletInputStream却只能读一次,这时候必须备份HttpServleRequest。
class BufferedServletInputStream extends ServletInputStream { private ByteArrayInputStream inputStream; public BufferedServletInputStream(byte[] buffer) { this.inputStream = new ByteArrayInputStream( buffer ); } @Override public int available() throws IOException { return inputStream.available(); } @Override public int read() throws IOException { return inputStream.read(); } @Override public int read(byte[] b, int off, int len) throws IOException { return inputStream.read( b, off, len ); } } class BufferedServletRequestWrapper extends HttpServletRequestWrapper { private byte[] buffer; public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException { super( request ); InputStream is = request.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte buff[] = new byte[ 1024 ]; int read; while( ( read = is.read( buff ) ) > 0 ) { baos.write( buff, 0, read ); } this.buffer = baos.toByteArray(); } @Override public ServletInputStream getInputStream() throws IOException { return new BufferedServletInputStream( this.buffer ); } }
在Filter的doFilter()或者Servlet的doPost()中,
//备份HttpServletRequest HttpServletRequest httpRequest = (HttpServletRequest)request; httpRequest = new BufferedServletRequestWrapper( httpRequest ); //使用流 InputStream is = request.getInputStream(); //其他业务逻辑 //将request 传到下一个Filter chain.doFilter(request, response);
相关文章推荐
- ServletInputStream的重复读取(多次读取)(转)
- HttpServletRequest.getInputStream可读取多次解决方案之一,使用HttpServletRequestWrapper
- 为了多次读取ServletInputStream引发的一系列惨案
- 多次读取HttpServletRequest的inputstream方法 问题解决
- ServletInputStream重复读取问题
- Servlet的Request.getInputStream()只能读取一次问题
- 重复读取InputStream的方法
- Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件的方法
- Servlet的Request.getInputStream()只能读取一次
- 重复读取request中的inputstream
- Servlet的Request.getInputStream()只能读取一次问题
- java InputStream为什么不能重复读取
- JSP&&SERVLET学习笔记(六):getReader(), getInputStream()读取Body内容
- 过滤器中ServletInputStream只能读取一次问题
- SpringMvc上传文件遇到重复读取InputStream的问题
- inputstream多次读取,读取不到数据
- InputStream为什么不能被重复读取?
- 构建可重复读取inputStream的request
- Servlet的Request.getInputStream()只能读取一次问题
- 拦截器中,request中getReader()和getInputStream()只能调用一次,构建可重复读取inputStream的request.