跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java Web 拦截机制:Filter 与 Interceptor 对比实战

深入解析 Java Web 中的 Filter 与 Interceptor 拦截机制。Filter 基于 Servlet 规范,由容器管理,适用于编码、安全过滤等底层通用场景;Interceptor 基于 Spring MVC,可获取业务上下文,适用于权限校验、日志记录等业务逻辑。文章对比了两者在生命周期、执行时机、拦截范围等方面的区别,并提供了完整的代码实现示例。最后总结了执行顺序及黄金组合实践,帮助开发者根据实际需求选择合适的拦截方案。

虚拟内存发布于 2026/4/6更新于 2026/10/25103 浏览

一、理解核心概念

在 Java Web 开发中,**过滤器(Filter)和拦截器(Interceptor)**是两种核心的请求处理机制。它们虽然都能对请求进行拦截和处理,但定位截然不同:

  • Filter 是 Servlet 容器的'守门人',位于应用最外层
  • Interceptor 是 Spring MVC 的'执法官',位于框架内部

二、Filter:Servlet 容器的第一道防线

2.1 本质与特点

Filter 是 Java Servlet 规范 定义的组件,由 Servlet 容器(如 Tomcat)直接管理,不依赖任何框架,因此具有最强的通用性。

生命周期方法:

方法触发时机用途
init()应用启动时初始化配置
doFilter()每次请求核心处理逻辑
destroy()应用关闭时资源释放

执行流程:

请求 → Filter1 → Filter2 → Servlet/Controller → Filter2 → Filter1 → 响应
2.2 Spring Boot 中的实现方式

方式一:注解方式(适合简单场景)

@WebFilter(urlPatterns = "/api/*", filterName = "authFilter")
public class AuthFilter 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("认证检查结束");
    }
}
// 在主类开启扫描
@SpringBootApplication
@ServletComponentScan
public class Application {
}

方式二:配置类方式(推荐,更灵活)

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<AuthFilter> authFilter() {
        FilterRegistrationBean<AuthFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new AuthFilter());
        bean.addUrlPatterns("/api/*");
        bean.setOrder(1); // 控制执行顺序,数字越小越先执行
        return bean;
    }
}
2.3 Filter 的典型应用场景
场景说明
统一编码设置 UTF-8 编码,解决中文乱码
安全防护XSS 过滤、SQL 注入检测
跨域处理添加 CORS 响应头
请求日志记录所有请求的 IP、路径、耗时
数据压缩Gzip 压缩响应内容

三、Interceptor:Spring MVC 的精准拦截

3.1 本质与特点

Interceptor 是 Spring MVC 框架 提供的机制,只能拦截被 DispatcherServlet 处理的请求(即映射到 Controller 的请求)。它可以获取 Spring 上下文,与业务逻辑深度集成。

三个核心拦截点:

方法执行时机能否终止请求典型用途
preHandle()Controller 方法执行前可返回 false 终止登录验证、权限校验
postHandle()Controller 执行后,视图渲染前无法终止修改 Model、添加公共数据
afterCompletion()请求处理完成(含异常)无法终止资源清理、异常日志
3.2 完整实现示例
@Component
public class PermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 获取请求信息
        String uri = request.getRequestURI();
        System.out.println("【拦截】请求路径:" + uri);
        // 权限校验逻辑
        HttpSession session = request.getSession();
        if (session.getAttribute("user") == null && uri.startsWith("/admin")) {
            response.sendRedirect("/login");
            return false; // 拦截,不继续执行
        }
        return true; // 放行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 向视图添加通用数据
        if (modelAndView != null) {
            modelAndView.addObject("serverTime", new Date());
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        // 记录异常信息
        if (ex != null) {
            System.out.println("【异常】请求处理出错:" + ex.getMessage());
        }
        // 清理 ThreadLocal 等资源
    }
}

注册 Interceptor:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private PermissionInterceptor permissionInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(permissionInterceptor)
                .addPathPatterns("/admin/**", "/user/**") // 拦截路径
                .excludePathPatterns("/login", "/public/**"); // 排除路径
    }
}

四、核心区别对比

对比维度FilterInterceptor
规范来源Servlet 规范(J2EE)Spring MVC 框架
框架依赖不依赖 Spring,任何 Web 应用可用必须在 Spring 环境中使用
拦截范围所有请求(含静态资源、JSP)仅 DispatcherServlet 映射的请求
执行时机Servlet 之前Controller 前后
方法数量1 个 doFilter()3 个:preHandle、postHandle、afterCompletion
可获取对象ServletRequest、ServletResponseHttpServletRequest、HandlerMethod、ModelAndView
异常处理只能捕获 Filter 内部异常afterCompletion可捕获 Controller 异常
静态资源拦截支持默认不支持

五、执行顺序详解

当 Filter 和 Interceptor 同时存在时,执行流程如下:

1. Filter.doFilter() 前置代码 ↓
2. Interceptor.preHandle() ↓
3. Controller 方法执行 ↓
4. Interceptor.postHandle() ↓
5. 视图渲染 ↓
6. Interceptor.afterCompletion() ↓
7. Filter.doFilter() 后置代码

示意图:

请求进入 ↓
[Filter 1] ──┐
↓ │
[Filter 2] │ 过滤器链(双向拦截)
↓ │
[Servlet] │
↓ │
[Interceptor 1.preHandle] ──┐
↓ │
[Interceptor 2.preHandle] │
↓ │
[Controller 执行] │ 拦截器链(三阶段)
↓ │
[Interceptor 2.postHandle] │
↓ │
[Interceptor 1.postHandle] │
↓ │
[视图渲染] │
↓ │
[Interceptor 1.afterCompletion]┘
↓ [Interceptor 2.afterCompletion]
↓ [Filter 2 后置]
↓ [Filter 1 后置]
↓ 响应返回

六、实战选择指南

6.1 优先使用 Filter 的场景
  • 统一字符编码:需要在请求进入 Servlet 前就设置编码
  • 跨域处理(CORS):处理 OPTIONS 预检请求,早于 Spring MVC
  • 安全过滤:XSS、SQL 注入的输入预处理
  • 全局日志:记录所有 HTTP 请求的完整生命周期
  • 非 Spring 环境:纯 Servlet 应用
6.2 优先使用 Interceptor 的场景
  • 登录状态校验:可便捷获取 HttpSession 和 Spring Bean
  • 细粒度权限控制:结合 @PreAuthorize、Security 上下文
  • 性能监控:精确统计 Controller 执行时间
  • 业务操作日志:获取 HandlerMethod 知道调用了哪个方法
  • 视图数据增强:在 postHandle 中向 Model 添加数据

七、黄金组合实践

在实际项目中,两者配合使用才能发挥最大价值:

层级组件职责
外层Filter编码设置、CORS、XSS 过滤、请求日志
内层Interceptor登录验证、权限校验、性能监控、业务日志

典型配置示例:

// Filter 处理通用底层逻辑
@Bean
public FilterRegistrationBean<CharacterEncodingFilter> encodingFilter() {
    FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>();
    bean.setFilter(new CharacterEncodingFilter("UTF-8", true));
    bean.addUrlPatterns("/*");
    bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 最先执行
    return bean;
}

// Interceptor 处理业务逻辑
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new AuthInterceptor())
            .addPathPatterns("/api/**")
            .excludePathPatterns("/api/login");
}

八、面试高频问题

Q1:Filter 和 Interceptor 的本质区别是什么?

Filter 是 Servlet 规范,由容器管理;Interceptor 是 Spring MVC 机制,由框架管理。Filter 更早执行,能拦截所有请求;Interceptor 更晚执行,只能拦截 Spring MVC 请求,但能获取更丰富的上下文。

Q2:如何让 Interceptor 拦截静态资源?

修改 DispatcherServlet 的 url-pattern 为 /*,但会带来性能开销,通常不建议。静态资源拦截建议用 Filter。

Q3:afterCompletion 一定会执行吗?

只要 preHandle 返回 true 并执行了,无论后续是否异常,afterCompletion 都会执行,适合资源清理。

Q4:如何控制多个 Filter 的执行顺序?

使用 FilterRegistrationBean 的 setOrder() 方法,数字越小优先级越高。


九、总结

FilterInterceptor
定位容器层'护城河'框架层'城门守卫'
优势通用、底层、无框架依赖精细、灵活、可获取 Spring 上下文
最佳实践处理通用、底层问题处理业务、安全、监控逻辑

核心原则:Filter 做'通用处理',Interceptor 做'业务拦截',两者协同构建完整的请求处理体系。

目录

  1. 一、理解核心概念
  2. 二、Filter:Servlet 容器的第一道防线
  3. 2.1 本质与特点
  4. 2.2 Spring Boot 中的实现方式
  5. 2.3 Filter 的典型应用场景
  6. 三、Interceptor:Spring MVC 的精准拦截
  7. 3.1 本质与特点
  8. 3.2 完整实现示例
  9. 四、核心区别对比
  10. 五、执行顺序详解
  11. 六、实战选择指南
  12. 6.1 优先使用 Filter 的场景
  13. 6.2 优先使用 Interceptor 的场景
  14. 七、黄金组合实践
  15. 八、面试高频问题
  16. 九、总结

更多推荐文章

查看全部
  • OpenClaw 浏览器控制方案:AI 助手自动连接调试模式
  • whisper.cpp 跨平台语音识别部署全流程
  • 纯前端实现:利用 IP 地址获取用户地理位置及坐标
  • HTML5 存储技术详解:LocalStorage 与 SessionStorage
  • VS Code 关闭 Copilot 代码补全
  • 多模态模型开发实战:文本、图像与语音的融合应用
  • GitHub 代码文件抓取与数据可视化实践(Python 实现)
  • Python 数据统计指南:从环境配置到高级分析
  • 具身导航 VLN 最新论文汇总 | Vision-and-Language Navigation
  • 数据结构:八种常见排序算法详解
  • Git Reset 核心原理与协作边界指南
  • BERT 文本分类实战:代码逐行注释与原理详解
  • Ant Design Form 表单组件实现原理
  • ComfyUI 与 Photoshop 集成配置及工作流使用指南
  • 利用 ChatGPT 提示词定制个性化学习计划指南
  • ESP-Drone 开源无人机平台快速入门指南
  • Flutter 底部导航与 TabBar 多页切换实战及状态保持
  • Canvas 图像处理:利用 Web Worker 优化主线程性能
  • 配置 OpenClaw 机器人通过钉钉调用 OpenMetadata
  • OpenClaw 浏览器控制方案:利用 Chrome Debug 模式实现全自动控制

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online