概念层面的区别
过滤器(Filter)
基于Servlet规范,是Java Web标准的一部分
在请求到达Servlet之前和响应返回客户端之前进行处理
属于容器级别的组件
拦截器(Interceptor)
基于框架实现,如Spring MVC的拦截器
在Controller方法执行前后进行处理
属于框架级别的组件
执行时机和顺序
请求流程:
客户端 → Filter → Servlet → Interceptor → Controller → Interceptor → Servlet → Filter → 客户端
具体执行顺序:
Filter的doFilter()方法(请求前处理)
Servlet处理
Interceptor的preHandle()方法
Controller方法执行
Interceptor的postHandle()方法
Interceptor的afterCompletion()方法
Filter的doFilter()方法(响应后处理)
使用场景对比
过滤器适用场景:
字符编码设置
跨域处理
安全检查(如XSS防护)
日志记录
压缩处理
拦截器适用场景:
用户登录验证
权限检查
操作日志记录
性能监控
参数预处理
代码实现示例
过滤器实现:
@WebFilter("/*")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 请求前处理
System.out.println("Filter: 请求前处理");
chain.doFilter(request, response); // 继续执行
// 响应后处理
System.out.println("Filter: 响应后处理");
}
}
拦截器实现:
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("Interceptor: 控制器执行前");
return true; // 返回true继续执行
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor: 控制器执行后");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
System.out.println("Interceptor: 请求完成后");
}
}
主要区别总结
简单记忆:过滤器更"外层",拦截器更"内层";过滤器是容器级的,拦截器是框架级的。根据你的具体需求选择合适的方案。