2011-04-12 5 views
0

フィルタで応答のみを処理する方法はありますか。レスポンスフィルタの書き方は?

以下に記載されているコードは正しいですか?

public void doFilter(request , response , chain) { 
     //code to handle request 
      chain.doFilter(request, response); 
     //code to handle response . 
    } 

答えて

8

あなたの好みによって異なります。一般的に、あなたのサンプルは正しくありません。 chain.doFilterが返された後、応答で何かをするのは遅すぎます。この時点で、すべての応答はすでにクライアントに送信されており、コードにはアクセスできません。

requestおよび/またはresponseを独自のクラスにラップし、これらのラッパーをdoFilterメソッドに渡し、ラッパーの処理を処理する必要があります。

サーブレットAPIにはすでにラッパーが用意されています(HttpServletRequestWrapperおよびHttpServletResponseWrapperクラスを参照)。実際にクライアントに送信される出力を処理したい場合は、カスタムOutputStreamまたはWriterラッパーを作成し、HttpServletResponseラッパーからそれらを戻す必要もあります。ええ、たくさんのラッピング:

簡単なフィルタの中には、リクエストやレスポンスをラップすることなく動作するものがあります。 doFilterを呼び出す前に、リクエストヘッダーに既にアクセスすることができます。またはdoFilterを呼び出すことなくカスタム応答を送信することができます。しかし、リクエスト本体を処理したい場合は、それを読み取るだけではなく、それ以外のチェーンでは使用できません。この場合は、ラッピング手法を再度使用する必要があります。

0

コードが正常であるようです。

レスポンスのみを処理したい場合は、コードを//Code to handle response .セクションに置き、好きなように操作してください。

出力を使って何かをしたい場合は、サーブレット(および他のフィルタ)が書き込む可能性がある応答の出力ストリームを処理する特別な応答ラッパーを用意する必要があります。

2

あなたが表示するコードは完全に正しいわけではありませんが、用語の簡素化が必要です。 (およびその前の応答)の後でも、要求を「処理」することができます。

とは何ですか?は、プロセスが目的のターゲットに渡され、メソッドが戻るとターゲットの出力が完了したことを意味します。

より正確に言えば、要求が処理され、応答が生成された前と後です。

0

リクエストとレスポンスは読み取り専用です。彼らはその内容を変更するセッターメソッドを持っていません。しかし、javaによって組み込まれている "HttpServletRequestWrapperとHttpServletResponseWrapper"クラスを使ってコンテンツを変更することができます。元の要求オブジェクトと応答オブジェクトをラッパーオブジェクトで変更することで、元の要求オブジェクトと応答オブジェクトを実際に変更できます。

関連する問題