20
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SpringBootのTomcatのPostサイズ制限にハマった人へ

Posted at

SpringBootのTomcatのPostサイズ制限にハマった人へ

背景

Tomcatを使ったことがある人なら誰しもPostデータサイズのデフォルト制限(2MB)に引っかかって、Tomcatの設定を見直したことがあると思う。
私も以前に同じ経験をしたことがあり、そのときにTomcatのドキュメントを見直して「わかりにくいなー」と思った記憶があるが、そのときは特に記事にするほどでもないと思い、自分の記憶に留めておくだけで終わらせた。
けどつい最近、SpringBootでも同じ制限にひっかかったので、今後のためにまとめることにした。

素のTomcatの場合

本題の前に余談。
SpringBootを使わず、素のTomcatだけを使う場合は、$CATALINA_HOME/conf/server.xmlmaxPostSizeの指定があり、この値を変更することで対処する。maxPostSizeのデフォルトは2MB。
どうでもいいが、公式ドキュメントの記載箇所がわかりにくいと思うのは私だけ? 公式サイトに検索機能がほしいよね。

conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443" 
            maxPostSize="2097152"/> <!-- ←ここに設定 -->

SpringBootの組み込みTomcatの場合

今回の本題。
ご存知のとおり、SpringBootは内部にTomcatが組み込まれており、ビルドしたjarファイルだけで簡単にウェブアプリケーションを動作させることができる。
この内部に組み込まれているTomcatにも、デフォルト2MBのPostデータサイズ制限が存在する。
しかし、SpringBootの組み込みTomcatにはserver.xmlが存在しないため、素のTomcatとは違う方法で設定をしなければならない。

結論から言うと、application.propertiesに以下の項目を設定することで対処できる。

server.tomcat.max-http-form-post-size=2MB
server.tomcat.max-swallow-size=2MB
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB

ハマりポイント1:Content-Typeによって設定すべきプロパティが違う

注意すべきなのは、Post時のContent-Typeapplication/x-www-form-urlencoded(HTMLのformからsubmitしたときなど)の場合は、spring.servlet.multipart.max-request-size設定が効かない点だ。Qiita上でも「spring.servlet.multipart.max-request-size設定すれば解決」という記事が多く、以下のStack Overflowの記事を見つけるまで気づけなかった。

If you are using using x-www-form-urlencoded mediatype in your POST requests (as I do), the multipart property of spring-boot does not work. If your spring-boot application is also starting a tomcat, you need to set the following property in your application.properties file:

ハマりポイント2:古いSpringBootではプロパティ名が違う

今現在のSpringBoot最新版(v2.2.5)では上記のプロパティでよいが、古いバージョンだとプロパティ名が違うことがある。(自分もこれでハマって解決するのに時間がかかった)

## server.tomcat.max-http-form-post-size=2MB   # v2.2.5の場合はこっち
server.tomcat.max-http-post-size=2MB           # v2.1.6などはこっち

ちなみに、spring.servlet.multipart.max-file-sizespring.servlet.multipart.max-request-sizeについても、かなり古いSpringBootではプロパティ名が違う(spring.http.multipart.max-file-sizeだったりする)ので注意。

まとめ

今回の経験から学んだ教訓

ちゃんとSpringBootのバージョンを確認してからプロパティを調べよう

当たり前のことだけどね。

20
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?