HTTP サーブレットの応答コンテンツをキャプチャしてログに記録する方法
概要
リクエストとリクエストの両方をログに記録する応答コンテンツは、サーバー側の包括的なデバッグと監視に不可欠です。フィルターを介してリクエスト パラメーターにアクセスするのは簡単ですが、応答コンテンツを取得するのはより困難になる場合があります。この記事では、ログ記録のためにサーブレット応答をインターセプトしてコピーするフィルターを作成する方法について説明します。
応答コンテンツをキャプチャするフィルターの作成
応答コンテンツをキャプチャするには、 HttpServletResponse オブジェクトをラップし、getOutputStream() メソッドと getWriter() メソッドをオーバーライドするカスタム フィルターを作成する必要があります。これらのメソッドは、応答データを書き込むためのストリームを提供する役割を果たします。それらをオーバーライドすることで、データをインターセプトしてバッファーにコピーするカスタム ストリームを作成できます。
このタスクを実行するフィルターの例を次に示します。
@WebFilter("/*") public class ResponseLogger implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletResponseCopier responseCopier = new HttpServletResponseCopier((HttpServletResponse) response); try { chain.doFilter(request, responseCopier); responseCopier.flushBuffer(); } finally { byte[] copy = responseCopier.getCopy(); System.out.println(new String(copy, response.getCharacterEncoding())); } } }
レスポンス ラッパーのカスタマイズ
HttpServletResponseCopier クラスは、元の HttpServletResponse をラップし、データをインターセプトするカスタム ServletOutputStream を作成します。オーバーライドされた getOutputStream() メソッドと getWriter() メソッドは、ServletOutputStreamCopier インスタンスを作成して返します。
public class HttpServletResponseCopier extends HttpServletResponseWrapper { private ServletOutputStreamCopier copier; @Override public ServletOutputStream getOutputStream() { if (copier == null) { copier = new ServletOutputStreamCopier(getResponse().getOutputStream()); } return copier; } @Override public PrintWriter getWriter() { if (copier == null) { copier = new ServletOutputStreamCopier(getResponse().getOutputStream()); } return new PrintWriter(new OutputStreamWriter(copier, getResponse().getCharacterEncoding()), true); } }
応答データのインターセプトとコピー
ServletOutputStreamCopier クラスは、write( int b) 応答に書き込まれたデータをインターセプトするメソッド。データを元のストリームに書き込み、同時に後で取得できるように ByteArrayOutputStream にコピーします。
public class ServletOutputStreamCopier extends ServletOutputStream { private ByteArrayOutputStream copy; @Override public void write(int b) { outputStream.write(b); copy.write(b); } public byte[] getCopy() { return copy.toByteArray(); } }
キャプチャされた応答の取得
要求と応答のサイクル後完了すると、フィルターはキャプチャされた応答コンテンツを ServletOutputStreamCopier の getCopy() メソッドから取得します。このデータは、ログ記録やその他の目的に使用できます。
以上がJava で HTTP サーブレット応答コンテンツをキャプチャしてログに記録する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。