2009-06-29 47 views
4

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

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

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

想法?

(我的另一种方法涉及到编写自定义的Tomcat阀,但事实并非如此便携。)

+0

它怎么说,我问的问题第一,但_“这个问题以前有人问并且已经有了答案。“另一个问题是两个月后。它不是重复的吗? – 2015-06-01 16:07:21

回答

7

您可以使用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() { 
    } 
} 
+0

好吧,我遇到了三个问题:ONE)还有其他方法来设置状态,但我已经把它们放下了(我希望。)TWO )如果状态不明确(正如我的测试中发生的那样),这是否意味着我可以安全地假设它是200 OK?三)如果例如super.sendRedirect()抛出一个错误会发生什么?我开始发现这种方法过于冗长,并且没有信心我会在100%的时间内获得权威。 – 2009-06-29 12:07:01

0

你会考虑写周围的原始响应类的代理包装?这样你可以处理对象上的事件/方法调用。

+0

是的,我对细节很模糊。在这种情况下如何处理未处理的异常?我的代理包装会传回堆栈,它可能会更改状态码吗? (我真的不知道这是否可能。) – 2009-06-29 10:07:27

相关问题