如何从 ServletFilter 中的 ServletResponse 中获取 HTTP 状态代码?

我正在尝试报告从我的 web 应用返回的每个 HTTP 状态代码。但是,状态代码似乎无法通过ServletResponse访问,即使我将其转换为HttpServletResponse也是如此。有没有办法在 ServletFilter 中访问此值?


答案 1

首先,您需要将状态代码保存在可访问的位置。最好将响应与你的实现打包在一起,并保留在那里:

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;
    }

}

为了使用此包装器,您需要添加一个 servlet 过滤器,以便您可以执行报告:

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
    }

}

答案 2

从Servlet 3.0开始,有一个HttpServletResponse#getStatus()

因此,如果有升级的空间,请升级到Servlet 3.0(Tomcat 7,Glassfish 3,JBoss AS 6等),并且您不需要包装器。

chain.doFilter(request, response);
int status = ((HttpServletResponse) response).getStatus();

推荐