Products
GG网络技术分享 2026-04-16 00:03 2
说起过滤器和拦截器,我常常想起一场激烈的拳击赛——护城河 vs 城门守卫。两者都穿着铁甲,却在不同的时空交锋。读者们,你们准备好被这场乱斗淹没了吗?
过滤器是 Java Servlet 规范的原生产物,像一条环绕城池的巨型水坝, 他破防了。 先于任何框架把请求拦下来。

Servlet 前后都能插手,双向拦截;doFilter 是唯一的入口。噪音提醒:如果你把 Filter 当成万能钥匙,别怪它 切记... 在高并发下发出“嗡嗡”声——性能开销真的会让你夜不能寐。
Interceptor 属于 Spring MVC 的专属兵种,只能拦 这事儿我可太有发言权了。 截被 DispatcherServlet 处理的请求。它有三招必杀技:
preHandle: 前置检查,可返回 false 直接阻止后续施行。postHandle: 在 Controller 返回 ModelAndView 前干点活儿,比如添加公共数据。afterCompletion: 请求结束后收工, 无论成功还是异常,都能记录日志。情感爆炸点: 每次看到 false 从 preHandle 掉下来我都忍不住想给它一个拥抱——它救了多少业务免于“黑暗”。
| 维度 | 过滤器 | 拦截器 |
|---|---|---|
| 施行顺序 | 先于所有组件←→后置响应也能抓取 | 仅在 DispatcherServlet 之后 |
| 依赖框架 | 无依赖,Servlet 容器自带🛠️ | 必须在 Spring 环境中使用🚀 |
| 可获取对象 | ServletRequest / ServletResponse | HttpServletRequest / HttpServletResponse / HandlerMethod / ModelAndView |
| 是否可终止链路? | ❌ 不支持返回 false 终止,仅抛异常才会中断。 | ✅ 返回 false 即可阻断后续处理。 |
| 典型用途 🎯 |
|
|
| 性能开销 💣 | 略高 | 相对低 |
| 备注 | “Filter 是护城河,Interceptor 是城门守卫。” | 两者配合使用最佳! |
# 场景 # 我们有一个电商后台,需要做到:
@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