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!