Heim >Java >javaLernprogramm >Wie kann ich HTTP-POST-Request-Parameter mehrmals lesen, ohne sie zu verbrauchen?

Wie kann ich HTTP-POST-Request-Parameter mehrmals lesen, ohne sie zu verbrauchen?

DDD
DDDOriginal
2024-12-07 06:18:11207Durchsuche

How Can I Read HTTP POST Request Parameters Multiple Times Without Consuming Them?

Http-Servlet-Anforderungsparameter verschwinden im Posttext

Problem:

In einem Java-Servlet-Filter wird versucht, auf mehrere zuzugreifen HTTP-Anfrageparameter, die aus einem POST-Anfragetext abgerufen werden, führen dazu, dass der zweite Parameter nicht verfügbar ist. Dies liegt daran, dass durch die Verwendung der Parameter diese für die gesamte Anfrage verbraucht werden.

Frage:

Gibt es eine Möglichkeit, die Anforderungsparameter zu lesen, ohne sie zu verbrauchen?

Antwort:

Alternative Lösung:

Die Verwendung von Aspekten zum Erstellen einer benutzerdefinierten Interceptor-Komponente kann eine alternative Lösung sein, die mehrere Lesevorgänge ohne Einbeziehung der Filterkette ermöglicht und eine verbesserte Effizienz bietet.

Erweiterte HttpServletRequestWrapper-Lösung :

Um Anforderungskörperparameter für mehrere Lesevorgänge in einer Filterkette beizubehalten, erweitern Sie die HttpServletRequestWrapper-Klasse und verwenden Sie einen Eingabestream-Cache:

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

  // CachedServletInputStream implementation omitted for brevity
}

Filterverwendung:

Verpacken Sie die ursprüngliche Anfrage in der erweiterten Klasse, 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);

    // Perform multiple reads here

    chain.doFilter(multiReadRequest, response);
  }
}

Dieser Ansatz ermöglicht mehrere Lesevorgänge über getInputStream(), getReader() und Parameterabruf Methoden.

Update für neuere ServletInputStream:

Implementieren Sie die zusätzlichen Methoden isReady(), setReadListener() und isFinished() in der zwischengespeicherten Stream-Implementierung, um der Aktualisierung zu entsprechen ServletInputStream-Schnittstelle.

Das obige ist der detaillierte Inhalt vonWie kann ich HTTP-POST-Request-Parameter mehrmals lesen, ohne sie zu verbrauchen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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