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

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

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

虚拟内存发布于 2026/4/6更新于 2026/5/2032 浏览

一、理解核心概念

在 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. 九、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 别再盲目追“智能”:我与机器人打交道的3年,藏着最真实的科技温度
  • AI 绘画模型训练指南:基于 Kohya GUI 的本地部署与配置
  • Neo4j Desktop 2 本地部署与图数据库实战
  • 基于 Atlas 300I Duo 96G 推理卡使用 MindIE 与 WebUI 部署 32B 大语言模型
  • LangChain 速成课程:构建基于 OpenAI LLM 的应用
  • Python 爬虫技术原理与实战应用指南
  • 使用 pdf2docx 库将 PDF 文件转换为 Word 文档
  • 基于 DeepSeek 和 Cursor 从零打造智能代码审查工具
  • HTML 基础指南:结构、常用标签与 HTML5 新特性
  • 使用 LLaMA-Factory 进行大语言模型微调详解
  • jQuery 核心实战:选择器、DOM 操作与表单验证详解
  • OpenClaw + LMStudio + 飞书:搭建本地离线 AI 助手
  • OpenClaw、OpenAkita、MiniMax Agent 与 Kimi Claw 个人 AI 助手对比
  • AI 图像生成提示词:新手入门与最佳实践
  • 昇腾 NPU 部署 Llama 2 模型:性能测试与优化实践
  • GitMCP:将 GitHub 代码库变为实时文档中心的 MCP 工具,消除 AI 代码幻觉
  • AI 数字人:繁荣背后的伦理困境与法律迷局
  • Flume架构深度解析:构建高可用大数据采集系统
  • 深入 Spring Bean 作用域、生命周期与自动装配源码解析
  • 文心 ERNIE 4.5 开源模型架构、部署与评测分析

相关免费在线工具

  • 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