I'm trying to report on every HTTP status code returned from my webapp. However the status code does not appear to be accessible via the ServletResponse, or even if I cast it to a HttpServletResponse. Is there a way to get access to this value within a ServletFilter?
views:
1502answers:
3
+3
A:
Write an HttpServletResponseWrapper and override all the setStatus(), sendError(), and sendRedirect() methods to log everything. Write a Filter that swaps your wrapper in for the response object on every request.
Licky Lindsay
2009-08-19 19:21:18
+12
A:
First, you need to save the status code in an accessible place. The best to wrap the response with your implementation and keep it there:
public class StatusExposingServletResponse extends HttpServletResponseWrapper {
private int httpStatus;
public StatusExposingServletResponse(HttpServletResponse response) {
super(response);
}
@Override
public void sendError(int sc) throws IOException {
httpStatus = sc;
super.sendError(sc);
}
@Override
public void sendError(int sc, String msg) throws IOException {
httpStatus = sc;
super.sendError(sc, msg);
}
@Override
public void setStatus(int sc) {
httpStatus = sc;
super.setStatus(sc);
}
public int getStatus() {
return httpStatus;
}
}
In order to use this wrapper, you need to add a servlet filter, were you can do your reporting:
public class StatusReportingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
StatusExposingServletResponse response = new StatusExposingServletResponse((HttpServletResponse)res);
chain.doFilter(req, response);
int status = response.getStatus();
// report
}
public void init(FilterConfig config) throws ServletException {
//empty
}
public void destroy() {
// empty
}
}
David Rabinowitz
2009-08-19 19:32:07
+2
A:
One thing missing from David's answer above is that you should also override the other form of sendError:
@Override
public void sendError(int sc, String msg) throws IOException {
httpStatus = sc;
super.sendError(sc, msg);
}
William Rose
2009-09-30 02:52:20
Thanks William, I've added it to my sample.
David Rabinowitz
2010-04-29 06:30:02