Spring Boot如何配置內置Tomcat的maxPostSize值

Spring Boot配置內置Tomcat的maxPostSize值

Background

前端頁面表單輸入數據較多,包含多個文本、多張圖片,在數據未壓縮的情況下,最終上傳失敗。

Problem 1

後端報錯:

java.lang.IllegalStateException: The multi-part request contained parameter data (excluding uploaded files) that exceeded the limit for maxPostSize set on the associated connector

即:請求數據量過大,超出瞭最大閾值。

  • Solution

修改Spring Boot內置Tomcat的maxPostsize值,在application.yml配置文件中添加以下內容:

server:  
  tomcat:
    max-http-post-size: -1

Note: 以下配置並不能解決Tomcat請求數據量的限制問題

spring:
  servlet:
    multipart:
      max-file-size: 30Mb
      max-request-size: 100Mb

Problem 2

解決瞭應用服務器請求數據量過大問題後,在下一步寫入DB時又遇到瞭類似問題,超出瞭數據庫中最大允許數據包默認配置值。

Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (16800061 > 16777216). You can change this value on the server by setting the max_allowed_packet’ variable.

  • Solution

修改DB的max_allowed_packet值:

USE demo;
set global max_allowed_packet = 3*1024*1024*10; # 改為30M
show VARIABLES like '%max_allowed_packet%'; # 重啟DB連接生效

Note:MySQL中max_allowed_packet 的 默認配置:16777216 = 16 * 1024 * 1024,即16M

Tomcat設置maxPostSize導致Post請求不過去

問題

最近部署項目,用到的Tomcat 版本:7.0.82.0,發現一直登陸不瞭,查詢發現原來前端的數據傳遞不到後端

排查問題

通過debug日志發現,後端沒有接受到前端用戶的登陸數據,檢查發現Tomcat在server.xml中加入瞭,maxPostSize=0這個參數,先刪除這個參數發現數據過去瞭

分析

查詢瞭表示maxPostSize=0表示post請求不限制大小的,google瞭半天才發現,原來從 apache-tomcat-7.0.63 開始,參數 maxPostSize 的含義就變瞭: 如果將值設置為 0,表示 POST 最大值為 0,不限制 POST 大小需要將值設置為 -1。

在此版本之前設置為 0 表示不限制 POST 大小。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: