2009-06-29 37 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

相關問題