【Tomcat】HTTPリクエスト情報のパラメータが欠損する

今回は、「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」の設定情報の公式サイトです。