サーブレットフィルターを使用して応答にコンテンツを挿入する人の例をネットとスタックオーバーフローで検索してきましたが、出力をキャプチャ/圧縮したり、ヘッダーを変更したりする人の例しか見つかりません。私の目標は、すべてのHTML応答の終了</body>の直前にHTMLのチャンクを追加することです。
私は、HttpServletResponseWrapperを拡張して独自のPrintWriterを使用し、その上で書き込みメソッドをオーバーライドするソリューションに取り組んでいます。writeメソッド内に、最後の7文字を格納して、本文の終了タグと等しいかどうかを確認します。次に、残りのドキュメントに対して通常の書き込み操作を続行する前に、HTMLチャンクと本文の終了タグを書き込みます。
誰かがすでにこの問題を解決したに違いないと思います。おそらく私よりもエレガントに。サーブレットフィルタを使用してコンテンツを応答に挿入する方法の例をいただければ幸いです。
更新しました
コメントに応じて、 http: //www.oracle.com/technetwork/java/filters-137243.htmlからCharResponseWrapperを実装しようとしています。これが私のコードです:
PrintWriter out = response.getWriter();
CharResponseWrapper wrappedResponse = new CharResponseWrapper(
(HttpServletResponse)response);
chain.doFilter(wrappedRequest, wrappedResponse);
String s = wrappedResponse.toString();
if (wrappedResponse.getContentType().equals("text/html") &&
StringUtils.isNotBlank(s)) {
CharArrayWriter caw = new CharArrayWriter();
caw.write(s.substring(0, s.indexOf("</body>") - 1));
caw.write("WTF</body></html>");
response.setContentLength(caw.toString().length());
out.write(caw.toString());
}
else {
out.write(wrappedResponse.toString());
}
out.close();
リクエストもラップしていますが、そのコードは機能し、レスポンスに影響を与えることはありません。