昔はStruts2のStrutsPrepareAndExecuteFilterが文字化けするという問題がありましたが、
さっき試してみたら、
- POST→化けない
- GET→化ける
のようです。ただしGETについてはFilterDispatcherでも同じなので、
Struts2PrepareAndExecuteFilterのバグというわけではなさそうです。
で、今回はTomcatでアプリを動かしているため、useBodyEncodingForURIをtrueにすると
GETパラメータの文字化けは解消しました。(※UTF-8 on Chromeでしか試してませんが)
useBodyEncodingForURIの挙動
useBodyEncodingForURIがどのように動作するか調べてみると、
org.apache.catalina.connector.Requestの2990行目あたり、以下のコードが該当しているようです。
"parameters.setQueryStringEncoding"を呼び出すか否かを制御している、というわけです。
/** * Parse request parameters. */ protected void parseParameters() { parametersParsed = true; Parameters parameters = coyoteRequest.getParameters(); boolean success = false; try { // Set this every time in case limit has been changed via JMX parameters.setLimit(getConnector().getMaxParameterCount()); // getCharacterEncoding() may have been overridden to search for // hidden form field containing request encoding String enc = getCharacterEncoding(); boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI(); if (enc != null) { parameters.setEncoding(enc); if (useBodyEncodingForURI) { parameters.setQueryStringEncoding(enc); } } else { parameters.setEncoding (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING); if (useBodyEncodingForURI) { parameters.setQueryStringEncoding (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING); } } parameters.handleQueryParameters(); ... }