重复读取request中的body - Warp ServletRequest
BodyReaderHttpServletRequestWrapper.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| 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.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets;
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { private final byte[] body; private final String bodyString;
BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); bodyString = cloneBody(request.getInputStream()); body =bodyString.getBytes(StandardCharsets.UTF_8); }
@Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); }
@Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream delegate = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException { return delegate.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { }
@Override public void close() throws IOException { delegate.close(); super.close(); } }; }
private String cloneBody(ServletInputStream inputStream) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) > -1) { byteArrayOutputStream.write(buffer, 0, len); } byteArrayOutputStream.flush();
String line; StringBuilder sb = new StringBuilder(); try (BufferedReader reader = new BufferedReader( new InputStreamReader( new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), StandardCharsets.UTF_8) )) { while ((line = reader.readLine()) != null) { sb.append(line); } } return sb.toString(); }
String getBodyString() { return bodyString; } }
|
假设在ServletRequest
中
1 2 3 4 5 6
| public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) { BodyReaderHttpServletRequestWrapper wrapper = new BodyReaderHttpServletRequestWrapper(request); chain.doFilter(wrapper, response); } }
|