在 Java Web(尤其是 Spring/Spring Boot)开发中,拦截器(Interceptor) 和 过滤器(Filter) 都用于请求处理前后的增强,但它们在作用范围、执行时机、实现方式和使用场景上都有明显区别。
| 对比项 | 过滤器(Filter) | 拦截器(Interceptor) |
|---|---|---|
| 所属规范 | Servlet 规范 | Spring 框架 |
| 执行时机 | 请求进入 Servlet 前 | 进入 Controller 前 |
| 是否能访问 Controller | ❌ 不能 | ✅ 能 |
| 是否能获取 Spring Bean | ❌ 不能直接 | ✅ 可以 |
| 是否依赖 Spring | ❌ 不依赖 | ✅ 依赖 |
| 控制粒度 | 粗(URL 级别) | 细(方法 / 类级别) |
| 返回值 | void | boolean / 中断流程 |
| 典型应用场景 | 编码、跨域、日志、安全 | 登录校验、权限、参数校验 |
一次 HTTP 请求的执行顺序如下:
请求
↓
Filter(过滤器)
↓
DispatcherServlet
↓
Interceptor.preHandle()
↓
Controller
↓
Interceptor.postHandle()
↓
Interceptor.afterCompletion()
↓
Filter
↓
响应
✅ Filter 更早执行,Interceptor 更晚执行
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter before");
chain.doFilter(request, response);
System.out.println("Filter after");
}
}
HandlerMethod@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
System.out.println("Interceptor preHandle");
return true; // false 表示中断请求
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) {
System.out.println("Interceptor postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
System.out.println("Interceptor afterCompletion");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/api/login");
}
}
Filter 偏底层,Interceptor 偏业务。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。