Filter和Inteceptor的区别
2025年3月1日 · 783 字 · 2 分钟 · servlet
最近在处理Spring Security
的工作, 一个请求经过那么多过滤器和拦截器,到底有什么先后顺序又有什么关系呢?
在Java体系中,所有的http请求最后都经过servlet处理。就像我们一开始学习servlet的时候,编码我们需要自己在一个filter中处理,文件的上传和下载需要我们自己通过servlet api
获取字节流处理,等等一系列麻烦又繁多的工作,后来Spring MVC出现了,解决了这一问题。
Spring MVC本质上也是一个servlet,就是DispatcherServlet
,DispatcherServlet处理了业务请求,然后又通过DispatcherServlet返回,就像我们自己自定义一个servlet那样,只不过在处理servlet的过程中要复杂的多。
http -> filter -> servlet -> interceptor -> controller
Filter
和 Interceptor
是 Java Web 开发中常用的两种拦截机制,虽然它们都可以用来实现类似的功能,比如请求拦截、权限校验、日志记录等,但它们的作用范围、使用方式、生命周期等方面都有明显区别。
🧩一、Filter(过滤器)
javax.servlet.Filter
属于Servlet 规范中的组件,属于 Java EE 标准。使用在 Servlet 容器(如 Tomcat)级别。拦截 HTTP 请求和响应,在进入 Servlet 之前和响应返回客户端之前处理。
🧩 二、Interceptor(拦截器)
HandlerInterceptor
是Spring MVC 提供的功能,属于 Spring 框架层面。拦截 Controller 方法的调用
- 请求进入 DispatcherServlet 之后才生效(Filter 是 DispatcherServlet 之前)
特性 | Filter(过滤器) | Interceptor(拦截器) |
---|---|---|
所属体系 | Servlet 规范 | Spring MVC 框架 |
作用范围 | 所有请求,包括静态资源 | 仅拦截控制器请求(不包括静态资源) |
执行顺序 | 在 DispatcherServlet 之前执行 | 在 DispatcherServlet 之后执行 |
配置方式 | web.xml 或注解 | Java Config (WebMvcConfigurer ) |
拦截粒度 | 请求级别(request/response) | 方法级别(Handler) |
常用场景 | 编码、日志、权限、XSS | 登录、权限、日志、限流 |