今回は、「Tomcat」を使用しているとき、HTTPリクエストのパラメータが欠損する場合の原因と対応方法の例を紹介していきます。
検証環境
検証に使用した環境/ライブラリを次に記載します。
- Tomcat
- バージョン:8.5.78
原因
「Tomcat」では、HTTPリクエストのパラメータ数に制限があります。制限を超えた場合は、指定したパラメータを無視する動作となりパラメータが欠損した状態となります。
パラメータ数の制限は、「maxParameterCount」という設定項目で指定することができます。設定をしていない場合は、検証環境の「Tomcat」では「10000」に制限されます。
設定方法
「maxParameterCount」の設定例は、次のようになります。
【設定例】
「server.xml」の「maxParameterCount」に「10」を設定したときの例になります。
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
...
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="10" />
...
</Service>
</Server>
確認方法
HTTPリクエストのパラメータが欠損することを確認するアプリケーションを作成します。
【プログラム例】
プログラム内容は、パラメータとして「id」を取得して、件数を返却するサーブレットのプログラムになります。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/")
public class ExampleServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String[] ids = req.getParameterValues("id");
PrintWriter out = resp.getWriter();
out.println(ids.length);
}
}
作成後は、「Tomcat」にデプロイして起動中にします。
【実行例1】
「maxParameterCount」を「10」に設定します。実行するコマンド例は、次のようになります。12件のパラメータを指定したHTTPリクエスト実行します。
$ curl -X POST -d "id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12" http://localhost:8080
10
12件のパラメータを指定して実行すると、返却された値は10になっていることを確認できます。2件のパラメータが欠損したことを確認できました。
【実行例2】
「maxParameterCount」を「20」に設定します。実行するコマンド例は、次のようになります。12件のパラメータを指定したHTTPリクエスト実行します。
$ curl -X POST -d "id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12" http://localhost:8080
12
12件のパラメータを指定して実行すると、返却された値は12になっていることを確認できます。パラメータが欠損していないことを確認できました。
対応方法例
設定値修正
「Tomcat」の設定を変更できる場合は、「maxParameterCount」の設定値を変更します。
パラメータ数を減らす
類似したパラメータを送信している場合は、区切り文字などを使用して1つのパラメータにすることでHTTPリクエストのパラメータ数を減らすことができます。
まとめ
「Tomcat」を使用しているときに、HTTPリクエストのパラメータが欠損する原因と対応方法例を紹介しました。
参考資料
「Tomcat」の設定情報の公式サイトです。