网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

过滤器与拦截器,哪个更强大?

GG网络技术分享 2026-04-16 00:03 2


序章:谁才是 Web 世界的终极霸主?

说起过滤器和拦截器,我常常想起一场激烈的拳击赛——护城河 vs 城门守卫。两者都穿着铁甲,却在不同的时空交锋。读者们,你们准备好被这场乱斗淹没了吗?

一、 过滤器:从容不迫的“护城河”

过滤器是 Java Servlet 规范的原生产物,像一条环绕城池的巨型水坝, 他破防了。 先于任何框架把请求拦下来。

过滤器 Filter vs 拦截器 Interceptor
  • 施行时机:Servlet 前后都能插手,双向拦截;doFilter 是唯一的入口。
  • 能干啥:统一字符编码、 CORS、XSS、Gzip 压缩、日志记录……简直是全能选手。
  • 局限:只能捕获 Filter 内部异常,⚠️无法精准定位到 Controller 方法。

噪音提醒:如果你把 Filter 当成万能钥匙,别怪它 切记... 在高并发下发出“嗡嗡”声——性能开销真的会让你夜不能寐。

二、 拦截器:城门里的精锐卫队

Interceptor 属于 Spring MVC 的专属兵种,只能拦 这事儿我可太有发言权了。 截被 DispatcherServlet 处理的请求。它有三招必杀技:

  1. preHandle: 前置检查,可返回 false 直接阻止后续施行。
  2. postHandle: 在 Controller 返回 ModelAndView 前干点活儿,比如添加公共数据。
  3. afterCompletion: 请求结束后收工, 无论成功还是异常,都能记录日志。

情感爆炸点: 每次看到 false 从 preHandle 掉下来我都忍不住想给它一个拥抱——它救了多少业务免于“黑暗”。

三、 两者对比表

维度 过滤器 拦截器
施行顺序先于所有组件←→后置响应也能抓取 仅在 DispatcherServlet 之后
依赖框架无依赖,Servlet 容器自带🛠️必须在 Spring 环境中使用🚀
可获取对象 ServletRequest / ServletResponseHttpServletRequest / HttpServletResponse / HandlerMethod / ModelAndView
是否可终止链路?❌ 不支持返回 false 终止,仅抛异常才会中断。✅ 返回 false 即可阻断后续处理。
典型用途 🎯
  • CORS/跨域处理
  • XSS/SQL 注入防护
  • 统一编码
  • 登录校验
  • 权限控制
  • 操作日志 & 性能监控
性能开销 💣 略高 相对低
备注 “Filter 是护城河,Interceptor 是城门守卫。” 两者配合使用最佳!

四、 随意插入的一段噪音 🚧🚧🚧​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​‍‍‍‍‍‍‍‌‌‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎ ‎ ‎ ‎ ‎ ‎ ‎ ‎ ‍ ‌‌‌ ‌ ‌‌‌‌‌‌‌‌‌‍ ‍ ‍ ​‌ ‌ ‌‌‌​ ​​​​​​​​​​​​​​​​​​​​​​​​​​‌  😵‍💫  🌪️  🤯  ⚡️  ……​   🌀🌀🌀                              




五、实战案例:Filter + Interceptor 双剑合璧 🍣🍣🍣

# 场景 # 我们有一个电商后台,需要做到:

  • 统一 UTF‑8 编码 + 跨域头部设置 ;
  • 登录状态检查 + 权限校验 ;
  • 记录每一次 API 调用耗时与异常信息 。
 @WebFilter public class EncodingFilter implements Filter { @Override public void doFilter throws IOException , ServletException { // 设置编码 request.setCharacterEncoding; response.setCharacterEncoding; System.out.println; // 放行 chain.doFilter; System.out.println; } }
 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors { registry.addInterceptor) .addPathPatterns .excludePathPatterns; } }

LoginInterceptor 示例:

 public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle throws Exception { String uri = request.getRequestURI; System.out.println; HttpSession session = request.getSession; if  == null) { response.sendRedirect; return false; } return true; } @Override public void postHandle throws Exception { if  { mv.addObject); } } @Override public void afterCompletion throws Exception { if  { ex.printStackTrace; } System.out.println; } }

六、乱七八糟的感受与坑点 🌋🌋🌋

你想... 1️⃣ 别把所有功能都塞进 Filter!那样会导致链路太长,每个请求都要走一遍「水坝」——响应时间直接飙升。 2️⃣ Interceptor 必须确保 DispatcherServlet 映射为「/*」才能捕获静态资源, 否则 CSS/JS 将悄悄溜走,不被审计。 3️⃣ 两者顺序很重要:如果你在 Filter 中已经写了响应压缩, 而 Interceptor 又尝试修改响应体,那就会出现「流已关闭」的奇葩错误。 4️⃣ 调试时记得打开容器日志,否则你只能看到「噪音」而看不清真实调用栈。

七、谁更强大?其实是互补的狂欢 🎉🎉🎉

如果硬要挑一个「最强」,我只能说:没有绝对的王者!过滤器像是城市外围的大堤, 把所有污水提前过滤掉;拦截器则是城内警戒塔, 探探路。 对每一位进入宫殿的贵族进行细致审查。只有两者协同作战,你的网站才能兼顾平安性、可维护性和性能表现。

所以下次再有人问你「过滤器还是拦截器更强大?」时请笑着回他说:「让它们一起喝咖啡吧!」☕️☕️☕️ ——主要原因是只有 **混合** 才能产生真正的魔法,胡诌。。


提交需求或反馈

Demand feedback