[Seasar-user:19685] [mobylet] Content-Lengthが強制的に0で送出される

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2010年 5月 3日 (月) 23:19:12 JST


decoyです。

下記のページやsuga様のアドバイスを参考にフィルタを作成し、
全ページのソースの最後に<!-- filter success -->という文字列を入れる事に成功したのですが
(現時点ではURIによる判定はまだ実施しておりません。)
mobylet使用下でフィルタを通すとdocomoと判定された場合だけ、
Content-Lengthが強制的に0で送出され、真っ白画面になってしまいます。

MobyletResponseやForceWrapMobyletResponse、ForceWrapMobyletFilterを継承したりしてみたのですが
いずれもうまく動作せず、Content-Lengthが強制的に0で送出されてしまいました。

docomoと判定された場合でもContent-Lengthが強制的に0で送出されないようにするには
どのようにすればいいか、ご教授頂けますでしょうか。

sa-struts-tutorial-1.0.4-sp8、mobylet Ver 1.0.5を使用しています。

フィルタ、ラッパーのソースとweb.xmlの設定(mobyletfilterと今回のフィルタ部分のみ抜粋)を下記に記載します。

・src/main/java/tutorial/filter/ParseFilter.java

package tutorial.filter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletResponse;

import tutorial.wrapper.ParseWrapper;

public class ParseFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {

        ParseWrapper wrapper = new ParseWrapper((HttpServletResponse)response);

        chain.doFilter(request, wrapper);

        PrintWriter out = response.getWriter();

        String outHtml = wrapper.toString();

        outHtml = outHtml + "<!-- filter success -->";

        out.write(outHtml);
        out.flush();

        out.close();
    }

    public void init(FilterConfig config) throws ServletException {

    }

    public void destroy() {

    }

}


・src/main/java/tutorial/wrapper/ParseWrapper.java

package tutorial.wrapper;

import java.io.CharArrayWriter;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class ParseWrapper extends HttpServletResponseWrapper {

    private CharArrayWriter charArrayWriter = null;

    public ParseWrapper(HttpServletResponse response){

        super(response);
        charArrayWriter = new CharArrayWriter();
    }

    public String toString() {

        return charArrayWriter.toString();
    }

    public PrintWriter getWriter(){

        return new PrintWriter(charArrayWriter);
    }

}


・src/main/webapp/WEB-INF/web.xml

<filter>
    <filter-name>mobyletfilter</filter-name>
    <filter-class>org.mobylet.core.http.MobyletFilter</filter-class>
    <init-param>
        <param-name>mobylet.config.dir</param-name>
        <param-value>・・・</param-value>
    </init-param>
</filter>

<filter>
    <filter-name>parseFilter</filter-name>
    <filter-class>tutorial.filter.ParseFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>mobyletfilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

<filter-mapping>
    <filter-name>parseFilter</filter-name>
    <url-pattern>*.do</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>


以上、宜しくお願い致します。

// decoy


[E-MAIL ADDRESS DELETED] wrote :
> suga様
> 
> decoyです。
> 
> ご教授頂き有難う御座います。
> 
> この辺も見ながらやってみます。
> http://sirius.itfrontier.co.jp/jrun/docs/jr4/docs/html/Programmers_Guide/filters6.html
> 
> // decoy
> 
> 
> suga wrote :
>> suga です。
>>
>> 条件がわかりませんが、ファイル数が多く全体の構成を統一していないのなら
>> ServletFilterを使うのが一番手っ取り早いでしょうね。
>>
>> すべての処理をServletFilterで囲むようにしてHttpServletResponseの
>> Wrapperでその内部を処理させ、最後にレスポンスを文字列にしてから
>> 特定の文字列を差し込むようにするというところでしょうか。
>>
>> ただしレスポンスのサイズと回数によってはheap領域をわりと使うようになると
>> 思いますので、事前判定でWrapperが不要なら使わないようにするなど
>> 工夫は必要でしょう。
>>
> --
> suga ( [E-MAIL ADDRESS DELETED] )
> 
> 
> 
> 
> 2010/4/24<[E-MAIL ADDRESS DELETED]>:
>>> お世話になります。
>>> decoyです。
>>>
>>> SAStruts+Mayaaで構成されたシステムがあるのですが
>>> 特定のアクションやURIになった時にタグの前後(今回の場合であれば</body>の上)に
>>> 任意の文字列(<script>・・・</script>というような文字列)を入れたいと思っているのですが
>>> どのようにすれば宜しいでしょうか。
>>>
>>> Mayaaのファイル数が少なければ、テンプレートやレイアウトの</body>の上に直接書けば済む話ではありますが
>>> ファイル数が多く、またアクションによってレイアウトを使用していたり、していなかったりする為、
>>> 出力制御系の処理やフィルタを用いる等して一括で</body>の上にURIに応じた任意の文字列を入れたいと思っています。
>>>
>>> web.xmlで特定のURLパターンになった時にフィルタを用いれば実現出来るかと思ったのですが、方法がわかりませんでした。
>>>
>>>
>>> 上記のような場合、どのようにすれば実現出来るのか、ご教授頂けますでしょうか。
>>>
>>> 以上、宜しくお願い致します。
>>>
>>> // decoy
>>> _______________________________________________
>>> Seasar-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user


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