Spring Boot Reactive中WebClient报Jetty请求头过大异常的排查与解决
问题分析与解决方案
根因
这个异常的核心原因是Jetty客户端默认的请求头缓冲区大小不足以容纳某次请求的全部头内容:
- Jetty的
HttpGenerator在生成请求时,会使用固定大小的缓冲区存放请求行和所有请求头。当某次请求的总头(包括Cookie、自定义业务头等)体积超过这个缓冲区阈值时,会触发BufferOverflowException,最终被包装为BadMessageException: 500: Request header too large。 - 服务运行一个多月才出现异常,是因为平时请求头体积都在阈值内,直到某次请求的头意外变大(比如Cookie累积大量数据、业务接口临时添加大体积自定义头)才触发问题。
复现步骤
- 构造包含超大体积请求头的请求:比如添加多个大内容的Cookie,或者自定义一个值长度超过8KB的请求头。
- 使用当前配置的WebClient发送该请求,即可复现相同异常。
解决办法
1. 调整Jetty客户端的请求缓冲区大小
在HttpClient配置代码中,根据业务需求调大请求缓冲区阈值,添加如下配置:
// 设置请求缓冲区大小为32KB,可根据实际情况调整 httpClient.setRequestBufferSize(32768);
将这段代码放在httpClient.setIdleTimeout(idleTimeoutInMilliSeconds);之后、构建WebClient之前即可。
2. 从源头减少请求头体积
- 检查业务逻辑中的Cookie存储策略,避免在Cookie中存放过多非必要数据,仅保留核心标识信息。
- 排查自定义请求头,避免在头中传输大体积业务数据,这类数据建议放在请求体中传递。
3. 检查请求日志增强器
确认requestLogEnhancer.enhance(request)的逻辑是否存在异常:比如是否在某些场景下重复添加请求头,或者错误写入过大的头内容,导致总头体积超标。
内容的提问来源于stack exchange,提问作者Mansoor Ali
相关产品推荐
相关产品推荐

