Zugriff auf HTTP-Servlet-Anfrageparameter ohne Verbrauch
Problem:
Beim Zugriff auf mehrere HTTP-Anfragen Parameter innerhalb eines Servlet-Filters verwendet der anfängliche Parameterzugriff die Parameter, sodass sie für die spätere Verwendung nicht mehr verfügbar sind. Dieses Problem tritt insbesondere bei POST-Anfragen auf, bei denen sich Parameter im Anfragetext befinden.
Lösung:
Um auf Parameter zuzugreifen, ohne sie zu verbrauchen, können Sie HttpServletRequestWrapper erweitern und benutzerdefinierte Methoden implementieren um den Eingabestream zwischenzuspeichern:
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); } 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(); } // ... Implementation for newer versions of ServletInputStream interface } }
Indem Sie die ursprüngliche Anfrage mit dieser Klasse umschließen, können Sie auf den zwischengespeicherten Eingabestream zugreifen mehrmals innerhalb der Filterkette und darüber hinaus, sodass sowohl getParameterXXX als auch benutzerdefinierte Methoden wie doMyThing die Parameter lesen können:
public class MyFilter implements Filter { 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); } }
Das obige ist der detaillierte Inhalt vonWie kann ich ohne Verbrauch mehrmals auf HTTP-Servlet-Anforderungsparameter zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!