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!