お前が犯人か〜〜〜!!!!
今日、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を使う際は、充分お気を付け下さいませ。