允许修改入参和出参的过滤器Filter
新增MyHttpServletRequestWrapper类,否则Request的数据流只允许读一次
import org.springframework.util.StreamUtils; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; /** * 构建可重写请求对象的Request * 解决request.getInputStream()与request.getReader()只能调用一次的问题 */ public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { private byte[] requestBody = null; /** * Constructs a request object wrapping the given request. * * @param request The request to wrap * @throws IllegalArgumentException if the request is null */ public MyHttpServletRequestWrapper(HttpServletRequest request) { super(request); //缓存请求body try { requestBody = StreamUtils.copyToByteArray(request.getInputStream()); } catch (IOException e) { e.printStackTrace(); } } public byte[] getRequestBody() { return requestBody; } /* 可重写入参 */ public void setRequestBody(byte[] requestBody) { this.requestBody = requestBody; } /* 获取入参 */ public String getContent(){ return new String(requestBody); } /** * 重写 getInputStream() */ @Override public ServletInputStream getInputStream() throws IOException { if(requestBody == null){ requestBody= new byte[0]; } final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody); return new ServletInputStream() { @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener listener) { } @Override public int read() throws IOException { return bais.read(); } }; } /** * 重写 getReader() */ @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } }
新增MyHttpServletResponseWrapper类,增加返回数据流的读取
import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.*; /** * 构建可重写返回对象的Response */ public class MyHttpServletResponseWrapper extends HttpServletResponseWrapper { private ByteArrayOutputStream buffer = null; private ServletOutputStream out = null; private PrintWriter writer = null; public MyHttpServletResponseWrapper(HttpServletResponse resp) throws IOException { super(resp); buffer = new ByteArrayOutputStream();// 真正存储数据的流 out = new WapperedOutputStream(buffer); writer = new PrintWriter(new OutputStreamWriter(buffer)); } @Override public ServletOutputStream getOutputStream() throws IOException { return out; } @Override public PrintWriter getWriter() throws UnsupportedEncodingException { return writer; } @Override public void flushBuffer() throws IOException { if (out != null) { out.flush(); } if (writer != null) { writer.flush(); } } @Override public void reset() { buffer.reset(); } public byte[] getResponseData() throws IOException { flushBuffer(); return buffer.toByteArray(); } public String getContent() throws IOException { flushBuffer(); return buffer.toString(); } private class WapperedOutputStream extends ServletOutputStream { private ByteArrayOutputStream bos = null; public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException { bos = stream; } @Override public void write(int b) throws IOException { bos.write(b); } @Override public void write(byte[] b) throws IOException { bos.write(b, 0, b.length); } @Override public void write(byte[] b, int off, int len) throws IOException { bos.write(b, off, len); } @Override public boolean isReady() { return false; } @Override public void setWriteListener(WriteListener writeListener) { } } }
新增过滤器
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 重写入参、出参的过滤器Filter */ @Component public class MyTestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(req); MyHttpServletResponseWrapper responseWrapper = new MyHttpServletResponseWrapper(resp); //入参处理 requestWrapper.getContent(); //重定向其他controller requestWrapper.getRequestDispatcher("/xxx/xxx").forward(requestWrapper,responseWrapper); chain.doFilter(requestWrapper,responseWrapper); //返回参数处理 String json = responseWrapper.getContent(); //返回打印 response.getOutputStream().write(json.getBytes()); response.getOutputStream().flush(); } @Override public void destroy() { Filter.super.destroy(); } }