Skip to content

Instantly share code, notes, and snippets.

@hendrixjoseph
Last active May 25, 2022 17:04
Show Gist options
  • Save hendrixjoseph/1c737841fdc1aa92743fb1140069caf5 to your computer and use it in GitHub Desktop.
Save hendrixjoseph/1c737841fdc1aa92743fb1140069caf5 to your computer and use it in GitHub Desktop.
Lazily Check the Body of an HttpServletRequest
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.stream.Collectors;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class LazyRequestBodyChecker extends HttpServletRequestWrapper {
public LazyRequestBodyChecker(final HttpServletRequest request) {
super(request);
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ServletInputStream inputSteam = super.getInputStream();
final String string = new String(inputSteam.readAllBytes());
// Analyze or even modify the string here.
final InputStream innerStream = new ByteArrayInputStream(string.getBytes());
return new ServletInputStream() {
@Override
public boolean isFinished() {
return inputSteam.isFinished();
}
@Override
public boolean isReady() {
return inputSteam.isReady();
}
@Override
public void setReadListener(final ReadListener listener) {
inputSteam.setReadListener(listener);
}
@Override
public int read() throws IOException {
return innerStream.read();
}
};
}
@Override
public BufferedReader getReader() throws IOException {
final BufferedReader reader = super.getReader();
final String string = reader.lines()
.map(s -> s) // You could analyze or modify
.filter(s -> true) // the string in the stream itself
.collect(Collectors.joining());
// Or analyze or modify it here afterwards.
return new BufferedReader(new StringReader(string));
}
}
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class LazyRequestBodyCheckerFilter implements Filter {
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
chain.doFilter(new LazyRequestBodyChecker(httpServletRequest), response);
}
}
}
<filter>
<filter-name>LazyRequestBodyCheckerFilter</filter-name>
<display-name>LazyRequestBodyCheckerFilter</display-name>
<!-- Don't forget to include the fully qualified name if included in a package! -->
<filter-class>LazyRequestBodyCheckerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LazyRequestBodyCheckerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@hendrixjoseph
Copy link
Author

I reference this code in my blog post Lazily Check the Body of an HttpServletRequest.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment