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