spring-boot 配置 Undertow 服务器中 请求体得大小

解决方式

一个请求最大为100MB

spring:
  servlet:
    multipart:
      max-request-size: 100MB

分析过程

前提

某天突然发现来了这样得一个需求, 将图片变为base64 ,有两个服务,一个是a服务,一个是b服务,在a中上传图片,并且转换图片格式位base64,在通过fegin调用 b服务,b服务在做相关得操作,遇到了下面得两个问题

  • fegin 调用得时候,采用post得方式,得将base64得字符串放在请求体中
  • Undertow 能接受得请求体得大小

feign调用得这个废了好大得事情,最后发现了,不仅要指定请求方式,还得添加 @RequestBody 注解,这就很离谱,看下面得一个列子

 @RequestMapping(value = "/test", method = RequestMethod.POST)
 Map<String, Object> test(@RequestBody JSONObject request);

返回正文,看看第二个问题,我是按照下面得来分析

  • springboot 得web模块,那肯定得从 DispatcherServlet中得 doDispatch 开始,我就一路断点进去了。
  • 在这里插入图片描述
    然后一路debug走,具体是怎么走得,这个是这样操作得
  • 首先开启debug日志
  • 看到一个方法,先F8过去,看看debug日志里面有没有报错,有得话,那就这个方法继续进去了。
    按照这个方法,就能找到问题出现在哪里
    下面是我debug得调用栈
    在这里插入图片描述
    问题就出现在了下面得代码
    在这里插入图片描述
    错误就是在这里抛出得,第106行用红框圈出来得代码。如果这里得 maxEntitySize < (state & MASK_COUNT) 就会进入这个 if 块里面
    那肯定就得很注意这几个了
  • exchange.getMaxEntitySize()
  • state
  • MASK_COUNT
    首先 这个state是参数是从哪里来得。
    还是根据调用栈得顺序,按个往上走,看哪里能用得到。

在这里插入图片描述
可以看到 在这里给state赋值了,看这里写的意思是,state得值为请求头里面得 Content-Length 得值,至于是不是,各位可以继续往下走走看看哈。我在这里就不走了。

那么回过头 再来看看 MASK_COUNT是从哪里来得。一看这个玩意,一眼就能看出,是一个常量。点一下看看,就有下面得了
在这里插入图片描述
那这个值是多少呢? 计算一下看看
在这里插入图片描述
明了了吧。
在来看看 exchange.getMaxEntitySize() 方法,其实就是 httpServerExchange中得maxEntitySize属性。
点进去看看
在这里插入图片描述
那这个值是在哪里给得呢。
点一下看看,发现了两个地方

  • 一个是构造函数
    在这里插入图片描述
  • 一个是set方法
    在这里插入图片描述
    那就在这里各自打一个断点,然后重新跑一遍看看 看看这个值是在哪里设置得
    先是看看构造方法
    在这里插入图片描述
    通过调用栈可以看得到,那就看看 httpReadListener里面得 maxEntitySize 属性是在哪里取值得,点一下看看
    在这里插入图片描述
    看到了,在这里
    那还是老套路,计算一下,看看这个值是多少。
    在这里插入图片描述
    直接就-1,就很离谱, 在多说一点哦,
    之前看到有人说配置下面得
    在这里插入图片描述
    那这个值在Undertow 里面到底是什么呢?
    在这里插入图片描述
    其实是这个值,看到了哦,和maxEntitySize 没有关系,至于 maxRequestSize 是个啥,有啥作用,我没看,等我之后有时间了看看在写写

在来看看 set方法
在这里插入图片描述
看看调用栈得顺序,找到了它set 得时候,如果稍微仔细看得话,思考思考,这里是调用 exchange对象,那这个对象肯定已经new出来,那new出来了肯定会调用它得构造方法,那就说明,之前构造方法 给得 maxEntitySize是没有用得,在这里是会覆盖掉得,那继续看看
在这里插入图片描述
这个info 里面是干了啥。
在这里插入图片描述
可以看到,从info 里面进去,计算一下, 得到得是 dispatchServlet,获得得 maxRequestSize 其实就是得到了 dispatchServlet里面得 配置 答案已经慢慢出来了,但是还是可以点进去看看,
在这里插入图片描述
继续可以看到这里已经设置了,请求体得大小,在看看 multipartConfig对象,是个啥子玩意 在这里插入图片描述
看到了吧,答案已经出来了,
exchange 中得 maxEntitySize 得大小 取得是 servlet 中配置得 maxRequestSize 得大小
可以看到 在servlet中 maxRequestSize 默认是-1 ,表示无限大,在看看spring帮我们配置得时候得大小
在这里插入图片描述
spring 中默认得是10mb ,ok了。到这里我的分析就结束了。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring-boot-starter是Spring Boot框架的一个核心模块,它提供了一组默认的依赖项,用于快速启动和配置Spring Boot应用程序。它的执行流程如下所示[^1]: 1. 引入spring-boot-starter依赖:在项目的pom.xml文件,通过添加spring-boot-starter依赖来引入该模块。这个依赖会自动管理其他相关的依赖项,以及提供默认的配置。 2. 自动配置Spring Boot使用自动配置机制来根据项目的依赖和配置来自动配置应用程序。它会根据classpath的依赖项和配置文件来决定应用程序的行为。 3. 启动应用程序:通过运行主类的main方法来启动Spring Boot应用程序。Spring Boot会自动扫描并加载所有带有@SpringBootApplication注解的类,并创建应用程序上下文。 4. 加载配置Spring Boot会加载应用程序的配置文件,包括application.properties或application.yml文件。这些配置文件的属性将被绑定到相应的Java对象,以供应用程序使用。 5. 执行自定义逻辑:在应用程序启动过程,可以编写自定义的逻辑来处理特定的业务需求。例如,可以在应用程序启动时执行一些初始化操作或者注册一些自定义的Bean。 6. 运行应用程序:一旦应用程序启动完成,Spring Boot会创建一个内嵌的Web服务器(如Tomcat或Undertow),并将应用程序部署到该服务器上。这样,应用程序就可以接收和处理来自客户端的请求。 7. 处理请求:当应用程序接收到客户端的请求时,Spring Boot会根据请求的URL和配置的路由规则来确定应该调用哪个控制器方法来处理请求。控制器方法会根据业务逻辑进行处理,并返回相应的结果。 8. 返回响应:处理完请求后,控制器方法会返回一个响应给客户端。Spring Boot会根据请求的内容类型(如JSON、HTML等)来选择合适的视图解析器,将响应转换为相应的格式,并返回给客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值