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

FilterInterceptor 是 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 登录、权限、日志、限流