TomcatにおけるGETパラメータのデコーディング
どうも、GETパラメータのデコーディングがTC4とTC5で異なるようです。
TC4では問題なかったのに、TC5ではGETパラメータ値がデコードされません。(POSTパラメータはrequest#setCharcterEncodingした文字コードでデコードされます ← これはTC4でも5でも同じ)
外部設定ファイルにフラグ値(下記のisDecodeGet_変数)を設け、Tomcat5の場合はフラグをONにし、下記ロジックを通すことでとりあえずの解決。
// GET入力パラメータを、同エンコード形式でURLデコードする // ------------------------------------------------------ /* * Tomcat4とTomcat5では、GETパラメータの動作が異なる。 * < TC4 > * request#setCharacterEncoding()したエンコーディングでGETパラメータも * デコードされるため、ここでのデコード処理は不要。 * org.apache.catalina.connector.HttpRequestBase#parseParameters()を参照 * * < TC5 > * request#setCharacterEncoding()したエンコーディングではPOSTパラメータ * しかデコードされないため、ここでのデコードが必要。 * org.apache.coyote.tomcat5.CoyoteRequest#parseRequestParameters()を参照 * ※でもソースを読むと、TC4と方法は違うながらもデコードしようとしている * ように思われる。 * 2003/10/19 Tomcat5.0.13を調査。 */ // GETパラメータをデコードする設定の場合 if (isDecodeGet_) { if (request instanceof HttpServletRequest) { HttpServletRequest hrequest = (HttpServletRequest)request; // GETの場合はURLデコードする if ("GET".equalsIgnoreCase(hrequest.getMethod())) { // パラメータ名の数 for (Enumeration names = request.getParameterNames(); names.hasMoreElements();) { String name = (String)names.nextElement(); String values[] = request.getParameterValues(name); for (int i = 0; i < values.length; i++) { values[i] = new String(values[i].getBytes("ISO-8859-1"), sEncoding); } } } } }
※このロジックは、ServletFilterで行うようにしています。
追記(2004/01/22)
Mobsterさん http://fieldnotes.sytes.net/wiki/index.jsp?pid=SetCharacterEncoding によると、Tomcat4系でも、4.1.29は5系と同じみたいです。