Heim > Java > javaLernprogramm > Wie bleiben POST-Body-Parameter in Java-Servlets für mehrere Lesevorgänge erhalten?

Wie bleiben POST-Body-Parameter in Java-Servlets für mehrere Lesevorgänge erhalten?

Mary-Kate Olsen
Freigeben: 2024-11-30 22:42:11
Original
893 Leute haben es durchsucht

How to Preserve POST Body Parameters in Java Servlets for Multiple Reads?

So behalten Sie POST-Body-Parameter in HTTP-Servlet-Anfragen bei

Bei der Arbeit mit HTTP-Anfragen in Java-Servlets ist es wichtig, die Auswirkungen zu berücksichtigen Zugriff auf Anforderungsparameter bei der weiteren Verarbeitung in der Filterkette. Standardmäßig werden Parameter beim Lesen aus dem POST-Anforderungstext verbraucht, sodass sie für nachfolgende Filter oder Handler nicht verfügbar sind.

Das Problem: Verbrauchen von POST-Body-Parametern

In Java-Servlets , die Parameter des Anforderungshauptteils sind über request.getParameter() zugänglich. Diese Methode verbraucht jedoch den inputStream und daher schlagen nachfolgende Versuche, die Parameter abzurufen, fehl. Dieses Verhalten ist besonders problematisch für Filter, die auf die Parameter zugreifen müssen, bevor sie von Downstream-Handlern verwendet werden.

Lösung: HttpServletRequestWrapper erweitern

Um dieses Problem zu beheben, können wir Erweitern Sie HttpServletRequestWrapper, um eine benutzerdefinierte Anforderungsimplementierung zu erstellen, die den Anforderungstext zwischenspeichert. Dadurch können wir den Körper mehrmals lesen, ohne ihn zu verbrauchen.

Hier ist eine Beispielimplementierung:

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

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

        // Implement other methods required by ServletInputStream interface, such as isFinished, isReady, setReadListener, etc.

    }
}
Nach dem Login kopieren

Verwendung:

Um POST zu bewahren Mit den Body-Parametern können wir die ursprüngliche Anfrage in unsere MultiReadHttpServletRequest einbinden, bevor wir sie durch den Filter leiten Kette:

public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        // Wrap the request to enable multiple reads of the request body
        MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) request);

        // Read the request body for our own processing
        doMyThing(multiReadRequest.getInputStream());

        // Continue the filter chain with the wrapped request, allowing subsequent handlers to access the cached request body
        chain.doFilter(multiReadRequest, response);
    }
}
Nach dem Login kopieren

Durch die Verwendung dieses Ansatzes können wir mehrmals auf POST-Körperparameter zugreifen, ohne uns Sorgen machen zu müssen, dass sie vorzeitig verbraucht werden.

Das obige ist der detaillierte Inhalt vonWie bleiben POST-Body-Parameter in Java-Servlets für mehrere Lesevorgänge erhalten?. 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