首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从ServletFilter中的ServletResponse中获取HTTP状态代码?

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

Stack Overflow用户
提问于 2009-08-19 19:17:18
回答 7查看 86.4K关注 0票数 64

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-08-19 19:32:08

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

代码语言:javascript
复制
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过滤器,以便您可以进行报告:

代码语言:javascript
复制
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
    }

}
票数 91
EN

Stack Overflow用户

发布于 2010-11-29 23:35:16

从Servlet3.0开始,就有了HttpServletResponse#getStatus()

因此,如果有升级的空间,可以升级到Servlet3.0(Tomcat7、Glassfish 3、JBoss AS 6等),并且不需要包装器。

代码语言:javascript
复制
chain.doFilter(request, response);
int status = ((HttpServletResponse) response).getStatus();
票数 65
EN

Stack Overflow用户

发布于 2010-12-20 08:35:45

还需要包含#sendRedirect的包装器,最好将状态初始化为'200‘而不是'0’

代码语言:javascript
复制
private int httpStatus = SC_OK;

...

@Override
public void sendRedirect(String location) throws IOException {
    httpStatus = SC_MOVED_TEMPORARILY;
    super.sendRedirect(location);
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1302072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档