ServletInputStream的重復讀取(多次讀取)(轉)


歡迎和大家交流技術相關問題:
郵箱: 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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM