16826


環境は  
tomcat8  
Java8  
spring4.2  
です。

Contoroller側で、POSTリクエストのパラメータを受け取った際、日本語がハングル文字のような状態になります。

viewはファイル自体のエンコードがutf-8で、charsetもutf-8になっています。  
server.xmlでも  
useBodyEncodingForURI=true  
URIEncoding="UTF-8"  
となっております。

Springの設定ファイルでもencodingFilterの設定はしています。以下、  
WebApplicationInitializerの実装クラスの一部です。

[code]

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
    
        FilterRegistration.Dynamic characterEncoding = servletContext.addFilter("characterEncoding", characterEncodingFilter);
        characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/");
    
        servletContext.addListener(new 　　ContextLoaderListener(dispatcherContext));
    
[/code]

ちなみに文字化けした文字は  
「男」→「ç·」  
「女」→「å¥³」  
です。

ほかに文字コードを設定する場所が思い当たらないので、教えてください。

追記

下記が、コントローラーの呼び出し先メソッドです。

[code]

    @RequestMapping(value="/regist", method = RequestMethod.POST)
    public String regist(@RequestParam("last_name") String lastName,
                         @RequestParam("first_name") String firstName,
                         @RequestParam("mail") String email,
                         @RequestParam("password") String password,
                         @RequestParam("sexal") String sexal,
                         HttpServletRequest request,
                         HttpServletResponse response) throws Exception {
    
[/code]

このメソッド内では、DBにユーザー情報を登録する処理を行っております。

文字化けの確認方法は、  
1\. Eclipseのデバッガを使い、Variablesビューで確認した  
2\. 登録されたエンティティーをDBサーバーで直接確認した  
以上2点でした。


CC BY-SA 3.0
2015-09-17T16:32:19.503
16724
2015-09-21T15:42:43.250
2015-09-21T11:58:19.257
8396
8396
question
java spring 文字化け
HttpServletRequestのPOSTパラメータ(日本語)が文字化けする


URLのパターンが"/"でなく"/*"であるべきとおもいます。

[code]

    characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/");
    
[/code]

と言う部分ですが、

[code]

    characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
    
[/code]

では？

dispatcherTypesに何が指定されているかや、他にFilterがあるのかにもよりますが、  
dispatcherTypesもnullにしてEnumSet.of(DispatcherType.REQUEST)  
isMatchAfterもfalseで良さそうなので、

[code]

    characterEncoding.addMappingForUrlPatterns(null, false, "/*");
    
[/code]

としても良さそうです。

[参考:FilterRegistrationのJavadoc](http://docs.oracle.com/javaee/7/api/javax/servlet/FilterRegistration.html#addMappingForUrlPatterns-
java.util.EnumSet-boolean-java.lang.String...-)


CC BY-SA 3.0
2015-09-17T23:51:49.343
16731
2015-09-17T23:51:49.343
10103
16724
answer


原因がわかりました。  
view側で、今後File送信を実装する予定であったため、

[code]

    <form method="POST" action="/regist" enctype="multipart/form-data">
    
[/code]

と記載していました。  
もしやと思い、  
Controller側で

[code]

    String text = new String(lastName.getByte("ISO-8859-1"), "UTF-8");
    
[/code]

と書いてみたところ、日本語を取得することができました。

ただ、この場合、MultipartFileをformから送信する場合、  
すべてのパラメータに対し、コントローラー側でのエンコード変換が必要になりますが、  
もし回避策があるようであれば教えていただけるとうれしいです。


CC BY-SA 3.0
2015-09-21T15:42:43.250
16826
2015-09-21T15:42:43.250
8396
16724
answer