Heim > Java > javaLernprogramm > Wie aktiviere ich mehrere Lesevorgänge des POST-Anfragetexts in Java-Servlet-Filtern?

Wie aktiviere ich mehrere Lesevorgänge des POST-Anfragetexts in Java-Servlet-Filtern?

Barbara Streisand
Freigeben: 2024-11-28 15:21:12
Original
205 Leute haben es durchsucht

How to Enable Multiple Reads of POST Request Body in Java Servlet Filters?

Mehrfaches Lesen des Post-Request-Bodys in Java-Servlet-Filtern

Problem:

In Java-Servlet-Filtern wird auf eine HTTP-Anfrage zugegriffen Parameter aus einem POST-Anfragetext können dazu führen, dass die Parameter später in der Filterkette nicht mehr verfügbar sind. Dies liegt daran, dass der Anforderungstext beim ersten Lesen verbraucht wird.

Lösung:

Um dieses Problem zu beheben und mehrere Lesevorgänge für die Parameter des Anforderungstexts zu ermöglichen, ist eine Lösung erforderlich Erweitern von HttpServletRequestWrapper und Zwischenspeichern der Eingabestream-Bytes. Hier ist eine benutzerdefinierte Anforderungs-Wrapper-Klasse:

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);
  }

  /* An input stream which reads the cached request body */
  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();
    }

    @Override
    public boolean isFinished() {
      return buffer.available() == 0;
    }

    @Override
    public boolean isReady() {
      return true;
    }

    @Override
    public void setReadListener(ReadListener listener) {
  throw new RuntimeException("Not implemented");
    }
  }
}
Nach dem Login kopieren

Verwendung:

Verpacken Sie die ursprüngliche Anforderung mit dem benutzerdefinierten Wrapper, bevor Sie sie durch die Filterkette weiterleiten:

public class MyFilter implements Filter {
  @Override
  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);
  }
}
Nach dem Login kopieren

Dies ermöglicht mehrere Lesevorgänge des Anforderungstexts, entweder über getInputStream() oder getReader() Methoden.

Hinweis:

Für neuere Versionen der ServletInputStream-Schnittstelle müssen zusätzliche Methoden wie isReady() und setReadListener() in der benutzerdefinierten Eingabestream-Klasse implementiert werden . Weitere Informationen finden Sie unter dem Link in der Antwort.

Das obige ist der detaillierte Inhalt vonWie aktiviere ich mehrere Lesevorgänge des POST-Anfragetexts in Java-Servlet-Filtern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage