您不能两次使用InputStream,需要创建一个包装类,以保留InputStream的可重复副本。
public class ReadTwiceHttpServletRequestWrapper extends HttpServletRequestWrapper {private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();public ReadTwiceHttpServletRequestWrapper(HttpServletRequest request) { super(request); try { IOUtils.copy(request.getInputStream(), outputStream); } catch (IOException e) { e.printStackTrace(); }}@Overridepublic BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(new ByteArrayInputStream(outputStream.toByteArray())));}@Overridepublic ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); return new ServletInputStream() { @Override public int readLine(byte[] b, int off, int len) throws IOException { return inputStream.read(b, off, len); } @Override public boolean isFinished() { return inputStream.available() > 0; } @Override public boolean isReady() { return true; } @Override public void setReadListener(ReadListener arg0) { // TODO Auto-generated method stub } @Override public int read() throws IOException { return inputStream.read(); } };}public void setBody(String body) { outputStream = new ByteArrayOutputStream(); try { outputStream.write(body.getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }}public String getBody() { return new String(outputStream.toByteArray());}}
然后,您需要使用链中第一个过滤器进行初始化。
public class ReadTwiceFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ReadTwiceHttpServletRequestWrapper readTwiceHttpServletRequestWrapper = new ReadTwiceHttpServletRequestWrapper( (HttpServletRequest) request); String newBody = readTwiceHttpServletRequestWrapper.getBody().replace("<soap:studentId>1</soap:studentId>", "<soap:studentId>2</soap:studentId>"); readTwiceHttpServletRequestWrapper.setBody(newBody); chain.doFilter(readTwiceHttpServletRequestWrapper, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}}



