[Seasar-user:21832] Re: [Teeda] Filterでのレスポンス内容加工について

HATTI [E-MAIL ADDRESS DELETED]
2014年 3月 13日 (木) 15:01:42 JST


小林様

お世話になっております。
hatti です。

ご回答ありがとうございます。

> それはFilterでHttpServletResponseを
> ラップしていないためでは?
こちら小林様にご回答いただいている通り、HttpServletResponseWrapper によりラップしたレスポンス
内でダミーのStringWriterに書き出しているフィルタ(SAStrutsの別プロジェクトでも利用しているFilter)
を利用して確認しておりましたが、対応不可という判断でした。
※連携した情報が少なくて申し訳ございません。

本日も引き続き調査していたところ
原因と思われる箇所が判明し、現在その方式で進めています。

原因はフィルタ内で最終的に書き込む際に、
PrintWriter res = response.getWriter();
している箇所があったのですが、引用元(SAStruts)ではViewテンプレートが「JSP」のため
Writerを利用していたのですが、
今回(Teeda)では、Viewテンプレートが「HTML」のため
ServletOutputStream realRes = response.getOutputStream();
とする必要がありました。

Writerに書き込む処理を、Streamに書き込む処理へ書き換えたところ
現在ではうまく動作しているようです。(動作確認中)

また、正しく OutputStream に書き直したフィルタでは
isCommitted が true にならなくなったため
この方式で問題無いと判断し進めています。
( Writer を Stream にしたからではなく、同時に他所も修正したことで
発生しなくなったと思われますが)

大変お手数おかけしましたが、ありがとうございました。

以上、よろしくお願いいたします。

2014年3月13日 2:30 Koichi Kobayashi <koichik @ improvement.jp>:

> 小林 (koichik) です。
>
> Filterを使うのがいいんじゃないでしょうか。
>
> > そこで、クライアントにレスポンスを返す直前に Filter で
> > レスポンス内容を加工したいのですが、既に isCommitted が true の
> > 状態のため書き換えることができませんでした。
>
> それはFilterでHttpServletResponseをラップ
> していないためでは?
> 通常Filterは必要に応じてRequest/Responseを
> ラップして次のFilterに渡します。
> このケースではHttpServletResponseをラップ
> (そのためのHttpServletResponseWrapper) して
> カスタムのWriter/OutputStrewamを返すことで
> レスポンスを自由に加工出来るはずです。
>
>
> On Wed, 12 Mar 2014 13:40:46 +0900, HATTI <hatti33 @ gmail.com> wrote:
>
> > お世話になっております。
> > hatti です。
> >
> > 表記の件、現在 Teeda (1.0.13-sp9) を用いた開発をしております。
> >
> > まずやりたいことですが、クライアントに表示する前に
> > 「レスポンス(html)内の全角数字を半角数字にする」などの共通後処理です。
> >
> > Teeda 的にはコンバータを作成して、各 Page クラスのフィールドに
> > アノテーションをつけていくのが正しいのだと認識はしているのですが
> > システム全体の共通処理のため、最終的にフィルタで実装すればよいかな
> > という方針で進めていました。
> >
> > そこで、クライアントにレスポンスを返す直前に Filter で
> > レスポンス内容を加工したいのですが、既に isCommitted が true の
> > 状態のため書き換えることができませんでした。
> >
> >
> その他、「javax<eclipse-javadoc:%E2%98%82=shohindb/src%5C/main%5C/webapp%5C/WEB-INF%5C/lib%5C/teeda-core-1.0.13-sp9.jar%3Cjavax>
> >
> .faces<eclipse-javadoc:%E2%98%82=shohindb/src%5C/main%5C/webapp%5C/WEB-INF%5C/lib%5C/teeda-core-1.0.13-sp9.jar%3Cjavax.faces>
> >
> .event<eclipse-javadoc:%E2%98%82=shohindb/src%5C/main%5C/webapp%5C/WEB-INF%5C/lib%5C/teeda-core-1.0.13-sp9.jar%3Cjavax.faces.event>
> > .PhaseListener」を実装したリスナーにより
> > 「PhaseId.RENDER_RESPONSE」の #afterPhase() でも試してみましたが
> > こちらでも対応ができませんでした。
> >
> (リスナー時点では、レスポンス内容が文字列ではなくまだ「javax<eclipse-javadoc:%E2%98%82=shohindb/src%5C/main%5C/webapp%5C/WEB-INF%5C/lib%5C/teeda-core-1.0.13-sp9.jar%3Cjavax>
> >
> .faces<eclipse-javadoc:%E2%98%82=shohindb/src%5C/main%5C/webapp%5C/WEB-INF%5C/lib%5C/teeda-core-1.0.13-sp9.jar%3Cjavax.faces>
> >
> .component<eclipse-javadoc:%E2%98%82=shohindb/src%5C/main%5C/webapp%5C/WEB-INF%5C/lib%5C/teeda-core-1.0.13-sp9.jar%3Cjavax.faces.component>
> > .UIComponent」
> > で、かつ ValueBinding クラス内で保持しているJSF式(例:#{hoge})が評価されていない
> > という認識ですが大丈夫でしょうか?)
> >
> > また、Teeda のソースファイルから dicon ファイルやfaces-config.xmlなどを参照し、
> > 拡張ポイントを拡張することで改善できないか検討してみましたが
> > あまり時間もかけられないため判断つかず、当メーリングリストで質問させていただきました。
> >
> > 長くなりましたが、お聞きしたいのは上記対応方法がそもそも間違っている、
> > こうしたらできるよ、などご教示いただけると大変助かります。
> > また、既存システムの改修のため、純粋な Teeda の環境ではないので
> > 上記方法でも、本来の純粋な Teeda ならいけるよ、などの情報でもありがたいです。
> >
> > 以上、よろしくお願いいたします。
>
>
> --
> {
>   name: "Koichi Kobayashi",
>   mail: "koichik @ improvement.jp",
>   blog: "http://d.hatena.ne.jp/koichik/",
>   twitter: "@koichik"
> }
>
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20140313/2c2ff2b6/attachment.html>


Seasar-user メーリングリストの案内