jdk5かつ、tomcat5.5.35以上か、6.0.33以上の場合にrequestパラメータが取得できない場合がある

先日、Strutsであるパラメータが空文字でActionFormに値が設定されるという事象に遭遇。
全てが取得できないとか、nullだとかならわかるんだけど、
「パラメータの値が1バイトの場合に空文字として設定」されるもんだから訳がわからない。

かなり苦しんでなんとか原因がわかったのでメモ。
ちなみに日本語の情報はみつけられなかったのですが、どこかにありますかね?
(バグレポートは日本人のようですが。。。)

現象

requestパラメータが1バイトの場合にservlet側で値を取得することができない。

解決方法

jdk6以上にあげる。

再現方法

  1. 下記の再現コードを下記のように配置しtomcatを起動。
  2. http://localhost:8080/test/form.html」にアクセス
  3. テキストボックスに1バイトの値を入力(※)
  4. submitボタン押下
  5. 値が表示されない

※2バイト以上の文字を入力すると値が表示される

%CATALINA_HOME%\webapps\test
├WEB-INF
│├classes
││└RequestServ.class
│└web.xml
└form.html

再現環境

環境
  • jdk5
  • Tomcat5.5.35以上か、6.0.33以上
バージョン詳細
バージョン 発生有無
1.5.0 ×
1.5.0_13 ×
1.5.0_15 ×
1.5.0_22 ×
1.6.0_35
  • Tomcat6
バージョン 発生有無
6.0.26
6.0.28
6.0.30
6.0.32
6.0.33 ×
6.0.35 ×
6.0.36 ×
  • Tomcat5
バージョン 発生有無
5.5.33
5.5.34
5.5.35 ×

※障害発生せず:○、障害発生:×

再現コード

Servlet
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestServ extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        res.setContentType("text/html; charset=Windows-31J");
        req.setCharacterEncoding("Windows-31J");

        PrintWriter out = res.getWriter();
        out.println("<HTML>");
        out.println("<BODY>");

        out.println(req.getParameter("name1"));

        out.println("</BODY>");
        out.println("</HTML>");
    }
}
HTML
<html>
<head>
  <meta http-equiv="Content-Type"
        content="text/html; charset=Windows-31J">
</head>
<body>

<form method="post" action="RequestServ">
  <input type="text" name="name1"/><input type="submit" value="submit"/>
</form>
</body>
</html>
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
  <servlet>
    <servlet-name>RequestServ</servlet-name>
    <servlet-class>RequestServ</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>RequestServ</servlet-name>
    <url-pattern>/RequestServ</url-pattern>
  </servlet-mapping>
</web-app>

関連URL

Javaの道:Servlet(2.クライアントからのデータ取得)
http://www.javaroad.jp/servletjsp/sj_servlet2.htm

Bug 52579 - Tomcat5.5.35+Java1.5 cannot return proper value of a request parameter
https://issues.apache.org/bugzilla/show_bug.cgi?id=52579