Is it possible to write a servlet filter to take inspect HTTP response codes?

java, servlet-filters, servlets

Solution

you can wrap your outgoing response using HttpServletResponseWrapper:

class GetStatusWrapper extends HttpServletResponseWrapper {

    private int status;

    GetStatusWrapper(HttpServletResponse response) {
        super(response);
    }

    @Override
    public void setStatus(int sc) {
        super.setStatus(sc);
        status = sc;
    }

    public int getStatus() {
        return status;
    }
}

then in your filter:

public class GetStatusResponseFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, 
                         ServletResponse response, 
                         FilterChain filterChain) 
                            throws IOException, ServletException {
        GetStatusWrapper wrapper;
        wrapper = new GetStatusWrapper((HttpServletResponse) response);
        filterChain.doFilter(request, wrapper);
        System.out.println("status = " + wrapper.getStatus());
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

Problem

Is it possible to write a servlet filter to take inspect HTTP response codes? I want to write a filter that will non-destructively inspect outgoing HTTP response codes. But, there does not seem to be a `getResponseCode()` like method on the Response object. It is also not clear to me how unhandled exceptions from the servlet are supposed to be dealt with. I really don't want this filter to actually set anything. Passive is good. Ideas? (My other approach involves writing a custom Tomcat valve, but that is not so portable.)

Original source

Related problems