この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

RequestDumperValve=文字化け

お前が犯人か〜〜〜!!!!


今日、POSTパラメータが文字化けするという問題と4時間くらい格闘していたのですが。

バイナリエディタまで引っ張り出してきて、文字化けの原因を探ったり。


僕にとってバイナリエディタを使うというのは、針の穴に糸を通す行為と言うか…まあとにかくシンドイです。苦手です。


で、結局のところこのトピックが決め手となり、RequestDumperValveが原因であることを突きとめました。

なぜRequestDumperValveが文字化けを起こす?

HttpServletRequestの実装は各サーブレットコンテナに任されているわけですが、
Tomcat(というかCatalina)のHttpServletRequest実装は、org.apache.catalina.connector.Requestです。


では実装を見てみましょう。


(一部抜粋)

    ...


    public String[] getParameterValues(String name) {

        if (!parametersParsed) // ← アウトー!!
            parseParameters();

        return coyoteRequest.getParameters().getParameterValues(name);

    }


    ...

    protected void parseParameters() {

        parametersParsed = true;

        ...
    }


    ...


・・・(;^ω^)


はい、アウト。


一度リクエストをパースすると、その結果はキャッシュされるようです。


ということは、setCharacterEncodingする前にリクエストがパース済みになってしまうと、もう手遅れというわけですね。
これが、原因なわけです。まあ、先に挙げたリンク先に書いてある通りなわけですが。



皆様方におかれましては、RequestDumperValveを使う際は、充分お気を付け下さいませ。