


Wie aktiviere ich mehrere Lesevorgänge des POST-Anfragetexts in Java-Servlet-Filtern?
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"); } } }
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); } }
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Top 4 JavaScript -Frameworks in 2025: React, Angular, Vue, Svelte

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache?

Node.js 20: wichtige Leistungssteigerung und neue Funktionen

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle?

ICEBERG: Die Zukunft von Data Lake Tabellen

Spring Boot Snakeyaml 2.0 CVE-2022-1471 Problem behoben

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden?

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung?
