在Spring框架中,Filter和Interceptor都是用于在请求处理前后执行特定逻辑的组件,但很多人都觉得它们无任何区别,表示用哪个都无所谓。
其实在本质上Filter是Servlet中的规范,而Interceptor是Spring MVC框架的规范,因此,Filter会拦截任何请求包括静态资源(如 .html , .js , .css )、JSP页面等,而Interceptor只处理Spring请求通常不包括静态资源
Filter只能操作原始的 ServletRequest 和 ServletResponse ,无法获取Spring MVC的上下文信息
Interceptor可以获取Spring MVC的详细信息,如:
HandlerMethod (Controller方法对象)、ModelAndView (模型和视图)、Spring的Bean还有异常信息。
它们的定义和注册方式也有本质上的区别:
Filter的前提需要在启动类加上 @ServletComponentScan 注解才能生效。随后通过 @WebFilter 注解指定过滤器类和过滤路径,要想指定不需要过滤的路径需要手动编写路径代码不是很方便
Interceptor必须使用配置类,显式注册到Spring MVC的拦截器链中:
1.首先,先定义Interceptor

2.随后需要创建配置类注册才能正常使用

addPathPatterns用来指定需要拦截的路径,excludePathPatterns用来指定不需要拦截的路径
路径匹配规则不同:
Filter中指定路径为 /* 匹配所用请求路径
Interceptor中指定路径为 /* 只匹配当前一级的路径(如 /user 匹配, /user/123 不匹配),要想匹配所有请求路径应该指定 /**
Filter的适用场景:
请求/响应字符编码(CharacterEncodingFilter)
跨域处理(CorsFilter)
请求日志记录
安全防护(XSS、SQL注入过滤)
权限校验(粗粒度)
Interceptor的适用场景:
登录认证和权限校验(细粒度)
接口性能监控
日志记录(包含Controller方法信息)
接口限流
公共参数注入
除此之外它们在一起使用时,执行顺序也会不同:
HTTP请求 → Filter → DispatcherServlet → Interceptor → Controller → Interceptor → Filter → HTTP响应
HTTP请求会首先进入Filter拦截器,在请求到达Spring的 DispatcherServlet( 前端控制器)之前拦截,Interceptor是在请求分发到具体Controller前后拦截。
在复杂业务中往往就会Filter配合Interceptor一起使用,通过Filter优先处理的特点进行预处理,再通过Interceptor进一步处理。
以上就是本篇总结的Filter过滤器和Interceptor拦截器的区别,若需要补充欢迎到评论区进行留言。






