是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码? [复制]

Posted

技术标签:

【中文标题】是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码? [复制]【英文标题】:Is it possible to write a servlet filter to take inspect HTTP response codes? [duplicate] 【发布时间】:2010-11-06 15:34:28 【问题描述】:

是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码?

我想编写一个过滤器,它可以非破坏性地检查传出的 HTTP 响应代码。但是,Response 对象上似乎没有类似getResponseCode() 的方法。

我也不清楚应该如何处理来自 servlet 的未处理异常。我真的不希望这个过滤器实际设置任何东西。被动就好。

想法?

(我的另一种方法是编写一个自定义的 Tomcat 阀门,但这不是那么便携。)

【问题讨论】:

怎么我先问了这个问题,但是“这个问题之前已经问过了,已经有了答案。”另一个问题是两个月后来的。不是重复的吗? 【参考方案1】:

您是否考虑围绕原始响应类编写代理包装器?这样您就可以处理对象上的事件/方法调用。

【讨论】:

是的,我对细节很模糊。在这种情况下如何处理未处理的异常?我的代理包装器是否会被传回调用堆栈,在那里可能会更改状态代码? (我真的不知道这是否可能。)【参考方案2】:

您可以使用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;
    

然后在您的过滤器中:

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() 
    

【讨论】:

好的,我在实现这个时遇到了三个问题:一个)还有其他设置状态的方法,但我已经把那些(我希望。)二)如果状态不是明确设置(就像我的测试中发生的那样),这是否意味着我可以安全地假设它是 200 OK?三)例如,如果 super.sendRedirect() 抛出错误会发生什么?我开始发现这种方法过于冗长,并且不相信我会在 100% 的时间内获得具有权威的 SC。 1) 这只是一个“看看它是否有效”的实现。 2) 绝对 3) 这是真正的问题 4) 恕我直言,没有其他便携式方法可以作为这个;只有少数方法必须重写 好的,它正在生产中并且似乎正在运行。谢谢。最后,我将 int status 初始化为 200,用内部 try/catch 块覆盖各种 setStatus、sendError 和 sendRedirect 方法。 不客气,你能在某处发布完整的课程吗?

以上是关于是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 java servlet 过滤器中的 OPTIONS 方法调用?

无法访问应用引擎开发服务器上的 servlet 过滤器中的会话数据

使用 Servlet 过滤器的 urlrewrite

Servlet 过滤器(自动登录)优先于声明性安全检查

Servlet过滤器介绍

从过滤器访问 servlet 注释