Spring MVC模式,到達Controller之前,還有filter和interceptor;如果filter和interceptor,做了一些通用處理,先讀取了請求中的inputSteam,Controller再去讀取的會(huì )報錯
報錯
封裝一個(gè)Wrapper,保存最初inputStream讀取出來(lái)的private byte[] buffer,每次取inputStream的時(shí)候,返回一個(gè)新的new BufferedServletInputStream(this.buffer);
然后把這個(gè)Wrapper往下傳遞
public class BufferedServletRequestWrapper extends HttpServletRequestWrapper {
private byte[] buffer;
public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
InputStream is = request.getInputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] tmp = new byte[1024];
int read;
while ((read = is.read(tmp)) > 0) {
os.write(tmp, 0, read);
}
this.buffer = os.toByteArray();
}
@Override
public ServletInputStream getInputStream() {
return new BufferedServletInputStream(this.buffer);
}
}public class BufferedServletInputStream extends ServletInputStream {
private ByteArrayInputStream inputStream;
public BufferedServletInputStream(byte[] buffer) {
this.inputStream = new ByteArrayInputStream(buffer);
}
@Override
public int available() {
return inputStream.available();
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public boolean isFinished() {
return inputStream.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener listener) {
throw new RuntimeException("Not implemented");
}
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = new BufferedServletRequestWrapper((HttpServletRequest) request);
......讀取request中的流......
request.getInputStream();
......
chain.doFilter(httpRequest, response);
}流的讀取本身是單向的,所以只能將流的內容讀取處理,放入 byte[] 中緩存起來(lái),然后每次 getInputStream 都利用 ByteArrayOutputStream 來(lái)構造 InputStream, 達到了類(lèi)似反復讀取流的效果,其實(shí)是一直構造新的 ByteArrayOutputStream 進(jìn)行讀取
聯(lián)系客服