Rumah >Java >javaTutorial >Bagaimana untuk Mengakses Parameter Permintaan HTTP Servlet Berbilang Kali Tanpa Penggunaan?

Bagaimana untuk Mengakses Parameter Permintaan HTTP Servlet Berbilang Kali Tanpa Penggunaan?

DDD
DDDasal
2024-11-30 10:15:19554semak imbas

How to Access HTTP Servlet Request Parameters Multiple Times Without Consumption?

Mengakses Parameter Permintaan Servlet HTTP tanpa Penggunaan

Masalah:

Apabila mengakses berbilang permintaan HTTP parameter dalam penapis Servlet, akses parameter awal menggunakan parameter, menjadikannya tidak tersedia untuk penggunaan seterusnya. Isu ini timbul terutamanya dengan permintaan POST di mana parameter berada dalam badan permintaan.

Penyelesaian:

Untuk mengakses parameter tanpa menggunakan parameter tersebut, anda boleh melanjutkan HttpServletRequestWrapper dan melaksanakan kaedah tersuai untuk cache strim input:

public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {
  private ByteArrayOutputStream cachedBytes;

  public MultiReadHttpServletRequest(HttpServletRequest request) {
    super(request);
  }

  @Override
  public ServletInputStream getInputStream() throws IOException {
    if (cachedBytes == null)
      cacheInputStream();

    return new CachedServletInputStream(cachedBytes.toByteArray());
  }

  @Override
  public BufferedReader getReader() throws IOException{
    return new BufferedReader(new InputStreamReader(getInputStream()));
  }

  private void cacheInputStream() throws IOException {
    cachedBytes = new ByteArrayOutputStream();
    IOUtils.copy(super.getInputStream(), cachedBytes);
  }

  private static class CachedServletInputStream extends ServletInputStream {
    private final ByteArrayInputStream buffer;

    public CachedServletInputStream(byte[] contents) {
      this.buffer = new ByteArrayInputStream(contents);
    }

    @Override
    public int read() {
      return buffer.read();
    }
    // ... Implementation for newer versions of ServletInputStream interface
  }
}

Dengan membungkus permintaan asal dengan ini kelas, anda boleh mengakses strim input cache beberapa kali dalam rantaian penapis dan seterusnya, membenarkan kedua-dua getParameterXXX dan kaedah tersuai seperti doMyThing membaca parameter:

public class MyFilter implements Filter {
  public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);
    doMyThing(multiReadRequest.getInputStream());
    chain.doFilter(multiReadRequest, response);
  }
}

Atas ialah kandungan terperinci Bagaimana untuk Mengakses Parameter Permintaan HTTP Servlet Berbilang Kali Tanpa Penggunaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn