読者です 読者をやめる 読者になる 読者になる

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

useBodyEncodingForURIの挙動

昔は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();

            ...
}