2009-06-29 8 views
4

HTTP応答コードを検査するためにサーブレットフィルタを記述することはできますか?HTTP応答コードを検査するためにサーブレットフィルタを記述することはできますか?

送信HTTPレスポンスコードを非破壊的に検査するフィルタを作成します。しかし、ResponseオブジェクトにはgetResponseCode()のようなメソッドはありません。

サーブレットの未処理の例外がどのように処理されるのかもわかりません。私は本当にこのフィルタが実際に何かを設定しないようにしています。受動は良いです。

アイデア?

+0

ですが、_ "この質問は前に頼まれましたすでに答えがあります。 "もう一つの質問は2ヵ月後に来た。重複していないのですか? –

答えて

7

あなたはHttpServletResponseWrapperを使用して、発信応答をラップすることができますどのように私は最初の質問をし、それが

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

問題を解決する方法は3つあります。1つはステータスを設定する方法がありますが、 )状態が明示的に設定されていない場合(私のテストで起こっているように)、それは私が安全にそれが200 OKであると仮定できることを意味しますか? THREE)たとえば、super.sendRedirect()がエラーをスローするとどうなりますか?私はこのアプローチが過度に冗長であることを見出し始めており、100%の時間で権限を持ってSCを取得するという自信がありません。 –

+0

1)これは「動作するかどうかを確認する」実装です。 2)絶対に3)これは本当の問題です4)IMHOこのような他のポータブルなアプローチはありません。あなたは – dfa

+0

をオーバーライドしなければならないほんの少数の方法しかありません。それは生産段階にあり、機能しているようです。ありがとう。最後に、intステータスを200に初期化し、さまざまなsetStatus、sendError、およびsendRedirectメソッドを内部try/catchブロックでオーバーライドします。 –

0

はあなたが元の応答クラスの周りのプロキシラッパーを書いて考えるでしょう(私の他のアプローチは、カスタムTomcatのバルブを書いて、それがとても移植性がありません。必要)?この方法で、オブジェクトのイベント/メソッド呼び出しを処理できます。あなたのフィルタで、その後

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; 
    } 
} 

+0

はい、私は詳細をあいまいにしています。この場合、処理されない例外はどのように処理されますか?私のプロキシラッパーはコールスタックに戻って渡されますか?ステータスコードを変更することは可能でしょうか? (これが可能かどうかは本当にわかりません) –

関連する問題