jdk5かつ、tomcat5.5.35以上か、6.0.33以上の場合にrequestパラメータが取得できない場合がある
先日、Strutsであるパラメータが空文字でActionFormに値が設定されるという事象に遭遇。
全てが取得できないとか、nullだとかならわかるんだけど、
「パラメータの値が1バイトの場合に空文字として設定」されるもんだから訳がわからない。
かなり苦しんでなんとか原因がわかったのでメモ。
ちなみに日本語の情報はみつけられなかったのですが、どこかにありますかね?
(バグレポートは日本人のようですが。。。)
現象
requestパラメータが1バイトの場合にservlet側で値を取得することができない。
解決方法
jdk6以上にあげる。
再現方法
- 下記の再現コードを下記のように配置しtomcatを起動。
- 「http://localhost:8080/test/form.html」にアクセス
- テキストボックスに1バイトの値を入力(※)
- submitボタン押下
- 値が表示されない
※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