ServletRequest中的getInputStream流处理

yzmm
784 阅读

ServletInputStream getInputStream(),返回请求主题当中的二进制流ServletInputStream对象,需要注意的是这个
ServletInputStream只能够读取一次,就会关闭了。如果在Filter里处理了这个ServletInputStream流,那么在应用层再次去取:request.getInputStream()拿到的必然是个空对象。
    为了避免这样的问题可以想办法复制这个流并处理然后交给HttpServletRequestWrapper(请求包装类)的子类一个处理后的流对象这样在应用层去request.getInputStream()拿到的流肯定就是包装后的流对象了。

        /**
	 * clone a InputStream
	 * @param inputStream
	 * @return
	 * @throws IOException 
	 */
	public static InputStream validateInputStream(InputStream inputStream,Properties properties) throws IOException{
		if(inputStream==null){
			return null;
		}
		byte[] b = new byte[1024];
		int n = 0;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		while((n=inputStream.read(b))!=-1){
			baos.write(b,0,n);
			os.write(b,0,n);
		}
		if(validateFormData(new ByteArrayInputStream(os.toByteArray()),properties)){
			return null;
		}
		return new ByteArrayInputStream(baos.toByteArray());
	}

private ServletInputStream servletInputStream;
@Override
public ServletInputStream getInputStream() throws IOException {
    return this.servletInputStream;
}


请求流复制:

请求包装子类:

评论 (0)

发表评论