質問: new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return new Filter[] { characterEncodingFilter }; } ``` ・Tomcxat Server.xmlに下記のように記述 web.xmlにcharacterEncodingFilter を追加すれば治るよ、という情報があちこちにあったため、 追加してみたのですがそれでもだめでした......、 FindBugなどでPOSTの中身を見てみると、 ``` /search?_csrf=d473774b-719c-4903-8f57-f4975138f755&baseCdC=&clntDnoC=&clntSeqC=&loginDateFrom=&loginDateTo=&nmKaV=%EF%BD%B1%EF%BD%B1%EF%BD%B1&nmKjV=%E3%81%82%E3%81%82%E3%81%82&ofcdC=&shcdC=&telNo=&zpcdC= ``` のようにUTF-8で送信されているように見えるので、 サーバー内部で文字コードが変換されているように思えます。 また、Javaで取得した文字コードをチェックしたところ、 ISO-8859_1になってしまっているようで、文字コード変換をかけてUTF8にすれば正しい値が取得できました。 とりとめもなく記載してしまいましたが、 上記のような現象に何か心当たりなどあるかたがおられましたら、 ご教授いただきたく思います。
回答: 過去にSpringBootを利用したときに、同じように POST したデータが文字化けするという事象があり もしかしたら同じ状況かもしれません その際の状況で分かったのは、 SpringSecurityFilterChain の方が CharacterEncodingFilter より先に実行される場合があり、 CharacterEncodingFilter で指定した文字コードが有効にならないというのが原因でした 以下の WebSecurityConfig を追加して、強制的に SpringSecurityFilterChain より先に CharacterEncodingFilter を実行するように設定することで解決できましたよ ``` @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); http.addFilterBefore(filter, CsrfFilter.class); } } ``` これは環境依存な問題のようで、 文字化けしない環境では CharacterEncodingFilter の方が先に実行されるんですが、 サーバーによって SpringSecurityFilterChain が先に実行される場合があり、その時に文字化けしているようでした 実行の順番はデバッグログに出てきます その先は時間がなく調査はしてないので根本原因は分かっていませんが。。 (参考) http://stackoverflow.com/questions/20863489/characterencodingfilter-dont-work-together-with-spring-security-3-2-0