content: package org.ruoyi.common.web.filter;
  
  import cn.hutool.core.io.IoUtil;
  import jakarta.servlet.ReadListener;
  import jakarta.servlet.ServletInputStream;
  import jakarta.servlet.ServletResponse;
  import jakarta.servlet.http.HttpServletRequest;
  import jakarta.servlet.http.HttpServletRequestWrapper;
  import org.ruoyi.common.core.constant.Constants;
  
  import java.io.BufferedReader;
  import java.io.ByteArrayInputStream;
  import java.io.IOException;
  import java.io.InputStreamReader;
  
  /**
   * 构建可重复读取inputStream的request
   *
   * @author ruoyi
   */
  public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {
      private final byte[] body;
  
      public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException {
          super(request);
          request.setCharacterEncoding(Constants.UTF8);
          response.setCharacterEncoding(Constants.UTF8);
  
          body = IoUtil.readBytes(request.getInputStream(), false);
      }
  
      @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 int available() throws IOException {
                  return body.length;
              }
  
              @Override
              public boolean isFinished() {
                  return false;
              }
  
              @Override
              public boolean isReady() {
                  return false;
              }
  
              @Override
              public void setReadListener(ReadListener readListener) {
  
              }
          };
      }
  }
  