当前位置: 首页 > news >正文

spring boot拦截器获取requestBody的巨坑

SpringBoot拦截器获取RequestBody的巨坑

在SpringBoot开发中,拦截器(Interceptor)是常用的功能组件,但获取RequestBody时却隐藏着不少坑点,让不少开发者踩坑。

问题现象

当你在拦截器的`preHandle`方法中尝试通过`HttpServletRequest`获取请求体时,可能会发现:

```java
Stringbody=request.getReader().lines().collect(Collectors.joining());
```

这段代码在某些情况下会抛出`IllegalStateException`异常,提示"Streamalreadyclosed"。

根本原因

1.请求流只能读取一次:Servlet规范规定,HttpServletRequest的输入流只能被读取一次,读取后流就会关闭。如果在拦截器中读取了,后续Controller就无法再获取。

2.Spring的@RequestBody处理机制:SpringMVC在处理@RequestBody参数时,会先读取请求体进行反序列化。如果拦截器先读取了请求体,会导致后续处理失败。

解决方案

1.使用ContentCachingRequestWrapper包装请求:
```java
publicclassRequestWrapperFilterimplementsFilter{
@Override
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain){
ContentCachingRequestWrapperwrapper=newContentCachingRequestWrapper((HttpServletRequest)request);
chain.doFilter(wrapper,response);
}
}
```

2.避免在拦截器中直接读取请求体:将需要请求体数据的逻辑移到Controller或Service层处理

3.使用AOP替代拦截器:对于需要请求体数据的场景,考虑使用SpringAOP的环绕通知

最佳实践

-对于只需要请求头/URL参数的验证,优先使用拦截器
-必须处理请求体时,确保使用RequestWrapper缓存请求体
-考虑将复杂请求体处理逻辑后置到业务层

记住:拦截器的设计初衷是处理请求的元数据而非请求体内容,理解这一设计理念能避免很多不必要的麻烦。
http://www.dtcms.com/a/473823.html

相关文章:

  • [2]python爬虫实践,爬取网易云音乐热歌榜排行版名称
  • 网站快速备案公司wordpress文章末尾加上相关文章
  • WebAssembly联调实践:Rust计算模块与Node.js后端的性能对比
  • 利用万网做网站建筑工程网下载
  • 麒麟系统开机启动
  • Redis-List
  • PHP基础教程:从入门到精通
  • 瓦力机器人-舵机控制(基于树莓派5)
  • 建设银行南通通州支行网站如何改wordpress里的代码
  • linux网站环境网站公司的好坏
  • 音视频学习(六十九):视音频噪声
  • Python 爬虫实战 | Selenium 高效自动化:Headless + 无痕浏览深度解析
  • Java SpringMVC(三)--- SpringMVC,SpringIoCDI
  • 网站建设的验收网站上如何放入地图
  • Java 开发工具,最新2025 IDEA 使用,保姆级教程
  • 内网穿透~
  • 【Java EE进阶 --- SpringBoot】Mybatis操作数据库(基础二)
  • 【ComfyUI】Flux 扩展原始图像边界
  • 068B-基于R语言平台Biomod2集成模型的物种分布模型构建和数据可视化教程【2027】
  • Custom SRP 12 - HDR
  • 偏振相机是否属于不同光谱相机的范围内
  • 烟台房地产网站建设视频直播服务
  • SQL Server中alter对于表的常用操作
  • 学校网站建设报告九江 网站建设公司
  • Blender图片转3D模型智能插件 True Depth V2附使用教程
  • 【数据分享】中国土地利用数据(1980-2015)
  • 工信部网站备案通知怎么样免费给网站做优化
  • Differentially Private Synthetic Text Generation for RAG——论文阅读
  • SQL入门:流程控制函数全解析
  • php网站虚拟机价格电子商务网站建设的意义