Servlet 的 Filter 和 Spring MVC 的 Interceptor 都能在请求前后插一脚,依赖不一样,执行顺序也不一样。
- Filter:配在
web.xml或FilterRegistration,挂在 Servlet 容器上。没有 Spring 也能用。 - Interceptor:配在 Spring MVC(实现
HandlerInterceptor),跟着 DispatcherServlet 走。
请求进来时,Filter 更靠外,先于 Interceptor。一个典型顺序是:Filter 进入 → Interceptor preHandle → Controller → Interceptor postHandle / afterCompletion → Filter 退出。
实现机制也常被拿来对比:Filter 更像在 Servlet API 上的回调链;Interceptor 是 Spring 里对处理器的包装,能拿到 Handler、ModelAndView。Interceptor 能做的事通常覆盖 Filter,而且能碰到控制器这一层的对象。
怎么选:
- 和框架无关的事——字符编码、整站跨域、很粗的登录有无——Filter 够用。
- 要按 Controller、要动 Model、要和 Spring Bean 协作——用 Interceptor。
两者可以同时在。Filter 解决容器级,Interceptor 解决应用级,不必互相替代。