稷然如此

  • 首页
  • 文章分类
    • AI
    • Android
    • Java
    • Shell
    • Vue
    • C#
    • Python
    • 数据库
    • 组件
    • 其他
    • Game
  • 常用命令
    • Docker
    • Git
    • Linux
  • 操作系统
    • CentOS
    • Ubuntu
    • Windows
    • Kylin
  • 工具
    • IntelliJ IDEA
    • Visual Studio Code
稷然如此
不积跬步,无以至千里
  1. 首页
  2. 文章分类
  3. Java
  4. 正文

Spring MVC 常见拦截器的区别

2024年11月6日 381点热度 0人点赞

1、拦截器

拦截器类型作用于备注标记
Filterinterfaceservlet*1
@Aspectannotation方法*2
HandlerInterceptorinterface@Controller/@RestController*1
@ControllerAdviceannotation仅定义 @Component
RequestBodyAdviceinterface@RequestBody*3
RequestBodyAdviceAdapterabstract@RequestBody*3
ResponseBodyAdviceinterface@ResponseBody*3

2、注意事项

  • *1 如读取输入流,会引发流读尽(EOF)的问题
  • *2 可直接获取参数,避免输入流读尽的问题
  • *3 无输入流读尽问题

3、使用情况

对特点的 Controller 记录 request 或 response,但不同的 Controller,有不同的参数表达和记录需要,他们也存在 Url、QueryString、Header 和 Body。
    • @RequestBody 型的 json body 业务
    • HttpServletRequest 直接使用 request
    • @PathVariable 使用路径参数
    • @RequestParam 使用request参数
    • @ModelAttribute 使用bind对象的

4、一般用法

其中比较隐蔽且常见的问题,就是一但需要记录 body 内容,不管是 request 还是 response,都会引发流被读尽(EOF)的问题,若是部分读取,就会破坏业务数据的完整性。
    • Filter-这个最重,处理所有 servlet,属于底层接口,慎用。
    • @Aspect-对方法参数处理时使用,会比 MVC 多一层 AOP
    • HandlerInterceptor-对 Controller 时使用,比 Filter 轻
    • XXXBodyAdvice-仅对 @XxxBody注解的参数有效

5、总结

因此,根据业务规模,吞吐量,需要选择不同的拦截层面,简单高效的处理数据,不多不少,刚刚好即可。
重点要区分是否读取 body。
    • 如果需要且是 @XXXBody 注解的,就使用 XXXBodyAdvice 省事。
    • 如果还需要方法的参数,使用 @Aspect 处理(都是spring bind后的)。
    • 如果要原始数据,就 HttpServletRequest 记录完整请求。
标签: Spring Spring MVC
最后更新:2024年11月6日

Akim

犇 骉 Java、C#、Python、Go、Android、MiniProgram、Bootstrap、Vue2

点赞
< 上一篇
下一篇 >
文章目录
  • 1、拦截器
  • 2、注意事项
  • 3、使用情况
  • 4、一般用法
  • 5、总结

Copyright © 2025 aianran.com All Rights Reserved.

免责申明 | 隐私政策 | 服务条款 | 关于我们

黔ICP备2023008200号-1

贵公网安备 52010202003594号