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; }
请求流复制:
请求包装子类: