java - 如何从 Servlet 过滤器中的 ServletResponse 中获取 HTTP 状态代码?

标签 java servlets servlet-filters http-status-codes

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

最佳答案

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

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
    }

}

关于java - 如何从 Servlet 过滤器中的 ServletResponse 中获取 HTTP 状态代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1302072/

相关文章:

java - 如何在不向用户显示堆栈跟踪的情况下处理 servlet 过滤器中的错误状态?

java - Android Eclipse 退出代码=15

java - 在 Google App Engine 中,当 isSecure() 返回 false 时,ServletRequest 上的 getScheme() 是否可以返回 "https"?”

java - 始终在 WebView 中显示缩放控件

java - 使用动态 jsp 和 servlet 构建 URL 有哪些策略?

java - 使用 java 从 Payment Gateway 重定向时,我丢失了 session 数据

java - 玻璃鱼服务器身份验证

spring - 如何在 Spring Security 3.2 中有问题地设置 Access-Control-Allow-Origin 过滤器

java - 删除最近在 JTextPane 上添加的 JLabel

java - 在java中重写具有更多参数的方法?