SpringBoot - 400 Bad Request Tomcat Header 请求过大解决方案

简介: SpringBoot - 400 Bad Request Tomcat Header 请求过大解决方案

推荐配置

1. server:
2.   max-http-header-size: 65536

过时配置

1. server:
2. tomcat:
3.     max-http-header-size: 65536

注意事项两个配置效果等价,但是推荐第一种用法!

  • 两个配置效果等价,但是推荐第一种用法!
  • 引起这问题的原因是跟 Tomcat 有关,请求过大导致 Tomcat 直接拦截返回,所以一般情况根本进不了业务里的断点,这样很容易误以为是网络层的问题,其实不是,而是 Tomcat 的问题。
  • max-http-header-size 指的不是 HTTP 的 header,而是传输的整个报文,这就解释了为什么 header 没啥东西时但请求很大的时候,可以用这个办法来解决问题。

引发问题

在某次项目的开发过程中,因为是接手的项目,所以下意思认为参数的配置是比较合理的,基本上除非涉及到地址等变更内容外,没有关注其他参数。当项目提测时,测试告诉我说整个系统并发到10基本就会被压垮,让我去检查下接口的设置。

我去系统上下载了日志,查看了堆栈内容,发现并没有明显的任何拖延时间的处理程序,整个内容获取的数据也在合理的范围内,但是一旦并发数上去了,就又会被压垮。当时因为其他问题比较紧急,就抓紧处理其他问题了。

在最后当我们处理完其他问题时,再回头来处理并发问题时,和同事一起检查参数设置的时候,才发现对于max-http-header-size被设置为了100M,也就是说每个请求都会打开100M的post,导致一到并发数上去,就会急剧激增内存,我不知道当时为啥设置这么多,估计是自己写的时候顺手写的一个数字,这提醒了我,如果是接受一个项目,还是要认真检查参数的配置,不然什么时候可能会坑到你自己。


目录
相关文章
|
1天前
|
前端开发 Java 应用服务中间件
从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
该文是一系列关于从零开始手写实现 Apache Tomcat 的教程概述。作者希望通过亲自动手实践理解 Tomcat 的核心机制。文章讨论了 Spring Boot 如何实现直接通过 `main` 方法启动,Spring 与 Tomcat 容器的集成方式,以及两者生命周期的同步原理。文中还提出了实现 Tomcat 的启发,强调在设计启动流程时确保资源的正确加载和初始化。最后提到了一个名为 mini-cat(嗅虎)的简易 Tomcat 实现项目,开源于 [GitHub](https://github.com/houbb/minicat)。
|
1天前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
48 2
|
1天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
|
1天前
|
前端开发 Java 应用服务中间件
从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
本文探讨了Spring Boot如何实现像普通Java程序一样通过main方法启动,关键在于Spring Boot的自动配置、内嵌Servlet容器(如Tomcat)以及`SpringApplication`类。Spring与Tomcat集成有两种方式:独立模式和嵌入式模式,两者通过Servlet规范、Spring MVC协同工作。Spring和Tomcat的生命周期同步涉及启动、运行和关闭阶段,通过事件和监听器实现。文章鼓励读者从实现Tomcat中学习资源管理和生命周期管理。此外,推荐了Netty权威指南系列文章,并提到了一个名为mini-cat的简易Tomcat实现项目。
|
1天前
|
Java 应用服务中间件 微服务
Spring Boot可以同时处理多少请求?
Spring Boot的并发处理能力受硬件、JVM配置、嵌入式Tomcat的线程池(默认最大连接数8192,最大等待数100)、应用效率、系统架构和网络条件影响。开发阶段可能处理数百个并发,优化后在适合的硬件上可处理数千乃至上万并发。大型系统常结合负载均衡器。
22 2
|
1天前
|
存储 Java 应用服务中间件
Springboot项目打war包部署到外置tomcat容器【详解版】
该文介绍了将Spring Boot应用改为war包并在外部Tomcat中部署的步骤:1) 修改pom.xml打包方式为war;2) 排除内置Tomcat依赖;3) 创建`ServletInitializer`类继承`SpringBootServletInitializer`;4) build部分需指定`finalName`;5) 使用`mvn clean package`打包,将war包放入外部Tomcat的webapps目录,通过startup脚本启动Tomcat并访问应用。注意,应用访问路径和静态资源引用需包含war包名。
|
1天前
|
Web App开发 前端开发 Java
SpringBoot之请求的详细解析
SpringBoot之请求的详细解析
22 0
|
1天前
|
前端开发 安全 Java
springboot集成springdoc-openapi(模拟前端请求)
springboot集成springdoc-openapi(模拟前端请求)
|
1天前
|
前端开发 Java 应用服务中间件
springboot 升级(1.5.7.RELEASE升级到2.7.10) Tomcat启动报错
springboot 升级(1.5.7.RELEASE升级到2.7.10) Tomcat启动报错
|
1天前
|
XML Java 应用服务中间件
Springboot中tomcat配置、三大组件配置、拦截器配置
Springboot中tomcat配置、三大组件配置、拦截器配置