ServletRequest中的getInputStream流处理
-
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;
}
请求流复制:
请求包装子类: