网站怎么做聚合页面,wordpress rss 下一页,wordpress标题字体大小,苏州公司网站建设公司post请求体内容无法重复获取 为什么会无法重复读取呢#xff1f; 以tomcat为例#xff0c;在进行请求体读取时实际底层调用的是org.apache.catalina.connector.Request的getInputStream()方法#xff0c;而该方法返回的是CoyoteInputStream输入流 public ServletInputStream… post请求体内容无法重复获取 为什么会无法重复读取呢 以tomcat为例在进行请求体读取时实际底层调用的是org.apache.catalina.connector.Request的getInputStream()方法而该方法返回的是CoyoteInputStream输入流 public ServletInputStream getInputStream() throws IOException { if (usingReader) { throw new IllegalStateException(sm.getString(coyoteRequest.getInputStream.ise)); } usingInputStream true; if (inputStream null) { inputStream new CoyoteInputStream(inputBuffer); } return inputStream;} 在使用CoyoteInputStream进行读取时 public int read(byte[] b, int off, int len) throws IOException { // 如果流关闭则抛出异常 if (closed) { throw new IOException(sm.getString(inputBuffer.streamClosed)); }// 如果已经读完了则返回-1 if (checkByteBufferEof()) { return -1; } int n Math.min(len, bb.remaining()); bb.get(b, off, n); return n;} 而流读取完毕都会进行close这个流close之后close状态就置为了true所以导致流无法进行二次读取 那么如何解决呢将tomcat的Request类进行重新实现吗代价太大了sun公司当初在设计的时候就已经提供了解决方法对于请求和响应sun公司提供了包装类可以HttpServletRequestWrapper类包装原始的request对象实现了HttpServletRequest接口的所有方法内部调用了所包装的request对象的对应方法相应的也有HttpServletResponseWrapper类来包装原始的response对象继承HttpServletRequestWrapper来进行方法重写可以使用HttpServletResponseWrapper和HttpServletRequestWrapper来进行定制响应和请求 public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { // 存储请求体 private byte[] body; private HttpServletRequest orgRequest; public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); this.orgRequest request; body HttpHelper.getBody(request); } public HttpServletRequest getOrgRequest() { return this.orgRequest; } // 重写读取从存储的字节数组中读 Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } // 重写读取从存储的字节数组中读 Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais new ByteArrayInputStream(body); return new ServletInputStream() { Override public int read() throws IOException { return bais.read(); } Override public boolean isFinished() { return false; } Override public boolean isReady() { return false; } Override public void setReadListener(ReadListener readListener) { } }; }} https://zhhll.icu/2020/javaweb/问题/6.post请求体内容无法重复获取/ 本文由 mdnice 多平台发布