在 Spring 框架中,过滤器(Filter)拦截器(Interceptor) 都是用于处理 HTTP 请求的中间件,但它们在作用范围、实现方式和生命周期上有显著区别。以下是详细对比和实现方式:


核心区别

特性过滤器 (Filter)拦截器 (Interceptor)
规范Servlet 规范 (J2EE 标准)Spring 框架特有
作用范围所有 Web 资源(Servlet、JSP、静态资源)仅 Spring MVC 管理的 Controller 请求
依赖依赖 Servlet 容器(如 Tomcat)依赖 Spring 容器
拦截时机在请求进入 Servlet 前 / 响应发送到客户端前在请求进入 Controller 前 / 后 / 视图渲染后
获取 Spring Bean不能直接获取(需通过工具类)可直接获取 Spring Bean
异常处理无法使用 Spring 的异常处理机制可结合 @ControllerAdvice 统一异常处理

实现方式

1. 过滤器 (Filter) 实现

过滤器是 Servlet 规范的一部分,通过实现 javax.servlet.Filter 接口实现。

步骤:

  1. 创建 Filter 类
import javax.servlet.*;
import java.io.IOException;public class CustomFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {// 初始化逻辑}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 1. 请求到达 Controller 前的逻辑System.out.println("Before Controller (Filter)");// 放行请求chain.doFilter(request, response);// 2. 响应返回客户端前的逻辑System.out.println("After Controller (Filter)");}@Overridepublic void destroy() {// 销毁逻辑}
}
  1. 注册过滤器(Spring Boot 中)
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<CustomFilter> customFilter() {FilterRegistrationBean<CustomFilter> bean = new FilterRegistrationBean<>();bean.setFilter(new CustomFilter());bean.addUrlPatterns("/*"); // 拦截所有路径bean.setOrder(1); // 执行顺序return bean;}
}

2. 拦截器 (Interceptor) 实现

拦截器是 Spring MVC 的组件,通过实现 HandlerInterceptor 接口。

步骤:

  1. 创建 Interceptor 类
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component
public class CustomInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 在 Controller 方法执行前调用System.out.println("Before Controller (Interceptor)");return true; // true=放行, false=中断请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {// 在 Controller 方法执行后、视图渲染前调用System.out.println("After Controller (Interceptor)");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 在整个请求完成后调用(视图渲染完毕)System.out.println("After View Render (Interceptor)");}
}
  1. 注册拦截器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Autowiredprivate CustomInterceptor customInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(customInterceptor).addPathPatterns("/**")    // 拦截所有路径.excludePathPatterns("/login"); // 排除路径}
}

执行顺序示例

假设请求路径被过滤器和拦截器同时拦截:

1. Filter: doFilter() [前逻辑]
2. Interceptor: preHandle()
3. Controller 方法执行
4. Interceptor: postHandle()
5. 视图渲染
6. Interceptor: afterCompletion()
7. Filter: doFilter() [后逻辑]

如何选择?

场景推荐使用
全局日志、字符编码、安全过滤Filter
权限验证、参数预处理Interceptor
需要 Spring 容器功能Interceptor
非 Spring 项目Filter

最佳实践:优先使用 Interceptor(可集成 Spring 特性),若需处理静态资源或深度请求/响应修改,则用 Filter。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88185.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88185.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88185.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CANFD 数据记录仪在新能源汽车售后维修中的应用

一、前言随着新能源汽车市场如火如荼和新能源汽车电子系统的日益复杂&#xff0c;传统维修手段在面对复杂和偶发故障时往往捉襟见肘&#xff0c;CANFD 数据记录仪则凭借其独特优势&#xff0c;为售后维修带来新的解决方案。二、 详细介绍在新能源汽车领域&#xff0c;CANFD 数据…

某当CRM XlsFileUpload存在任意文件上传(CNVD-2025-10982)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 前言: 我们建立了一个更多,更全的…

自然语言处理与实践

文章目录Lesson1&#xff1a;Introduction to NLP、NLP 基础与文本预处理1.教材2.自然语言处理概述(1)NLP 的定义、发展历程与应用场景(2)NLP 的主要任务&#xff1a;分词、词性标注、命名实体识别、句法分析等2.文本预处理3.文本表示方法&#xff1a;词向量表示/词表征Lesson2…

CSS揭秘:9.自适应的椭圆

前置知识&#xff1a;border-radius 用法前言 本篇目标是实现一个椭圆&#xff0c;半椭圆&#xff0c;四分之一椭圆。 一、圆形和椭圆 当我们想实现一个圆形时&#xff0c;通常只要指定 border-radius 为 width/height 的一半就可以了。 当我们指定的border-radius的值超过了 w…

善用关系网络:开源AI大模型、AI智能名片与S2B2C商城小程序赋能下的成功新路径

摘要&#xff1a;本文聚焦于关系在个人成功中的关键作用&#xff0c;指出关系即财富&#xff0c;善用关系、拓展人脉是成功的重要途径。在此基础上&#xff0c;引入开源AI大模型、AI智能名片以及S2B2C商城小程序等新兴技术工具&#xff0c;探讨它们如何助力个体在复杂的关系网络…

2025年渗透测试面试题总结-2025年HW(护网面试) 34(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 34 一、网站信息收集 核心步骤与工具 二、CDN绕过与真实IP获取 6大实战方法 三、常…

萤石全新上线企业AI对话智能体,开启IoT人机交互新体验

一、什么是萤石AI对话智能体&#xff1f;如何让设备听得到、听得懂&#xff1f;这次萤石发布的AI对话Agent&#xff0c;让设备能进行自然、流畅、真人感的AI对话智能体&#xff0c;帮助开发者打造符合业务场景的AI对话智能体能力&#xff0c;实现全双工、实时打断、可扩展、对话…

智绅科技:以科技为翼,构建养老安全守护网

随着我国老龄化进程加速&#xff0c;2025年60岁以上人口突破3.2亿&#xff0c;养老安全问题成为社会关注的焦点。智绅科技作为智慧养老领域的领军企业&#xff0c;以“科技赋能健康&#xff0c;智慧守护晚年”为核心理念&#xff0c;通过人工智能、物联网、大数据等技术融合&am…

矩阵系统源码部署实操指南:搭建全解析,支持OEM

矩阵系统源码部署指南矩阵系统是一种高效的数据处理框架&#xff0c;适用于大规模分布式计算。以下为详细部署步骤&#xff0c;包含OEM支持方案。环境准备确保服务器满足以下要求&#xff1a;操作系统&#xff1a;Linux&#xff08;推荐Ubuntu 18.04/CentOS 7&#xff09;硬件配…

基于python的个人财务记账系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

从 CODING 停服到极狐 GitLab “接棒”,软件研发工具市场风云再起

CODING DevOps 产品即将停服的消息&#xff0c;如同一颗重磅炸弹&#xff0c;在软件研发工具市场炸开了锅。从今年 9 月开始&#xff0c;CODING 将陆续下线其 DevOps 产品&#xff0c;直至 2028 年 9 月 30 日完全停服。这一变动让众多依赖 CODING 平台的企业和个人开发者陷入了…

#渗透测试#批量漏洞挖掘#HSC Mailinspector 任意文件读取漏洞(CVE-2024-34470)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

深入解析C++驱动开发实战:优化高效稳定的驱动应用

深入解析C驱动开发实战&#xff1a;优化高效稳定的驱动应用 在现代计算机系统中&#xff0c;驱动程序&#xff08;Driver&#xff09;扮演着至关重要的角色&#xff0c;作为操作系统与硬件设备之间的桥梁&#xff0c;驱动程序负责管理和控制硬件资源&#xff0c;确保系统的稳定…

SNIProxy 轻量级匿名CDN代理架构与实现

&#x1f310; SNIProxy 轻量级匿名CDN代理架构与实现 &#x1f3d7;️ 1. 整体架构设计 &#x1f539; 1.1 系统架构概览 #mermaid-svg-S4n74I2nPLGityDB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-S4n74I2nP…

Qt的信号与槽(一)

Qt的信号与槽&#xff08;一&#xff09;1.信号和槽的基本认识2.connect3.关闭窗口的按钮4.函数的根源5.形参和实参的类型&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Qt的学习】 &…

springMVC02-视图解析器、RESTful设计风格,静态资源访问配置

一、SpringMVC 的视图在 SpringMVC 中&#xff0c;视图的作用渲染数据&#xff0c;将模型 Model (将控制器&#xff08;Controller&#xff09;)中的数据展示给用户。在 Java 代码中&#xff0c;视图由接口 org.springframework.web.servlet.View 表示SpringMVC 视图的种类很多…

Go中使用Google Authenticator

现在为了安全Google二次验证使用越来越平凡了&#xff0c;所以我们自己做的一些产品中&#xff0c;也会用到Google Authenticator。 介绍 Google Authenticator采用的算法是TOTP&#xff08;Time-Based One-Time Password基于时间的一次性密码&#xff09;&#xff0c;其核心内…

ReactNative【实战系列教程】我的小红书 4 -- 首页(含顶栏tab切换,横向滚动频道,频道编辑弹窗,瀑布流布局列表等)

最终效果 顶栏 modules/index/components/topBar.tsx import icon_daily from "/assets/images/icon_daily.png"; import MaterialIcons from "expo/vector-icons/MaterialIcons"; import { useCallback, useState } from "react"; import { Im…

告别Root风险:四步构建安全高效的服务器管理体系

当整个开发团队都使用root账号操作服务器&#xff0c;且重要数据无备份时&#xff0c;系统如同行走在悬崖边缘。本文将分享一套经过验证的四步解决方案&#xff0c;帮助团队快速提升主机安全性。 为什么必须告别Root账号&#xff1f; 直接使用root账号的风险&#xff1a; &am…

【IM项目笔记】1、WebSocket协议和服务端推送Web方案

这里写自定义目录标题 1、HTTP和WebSocket协议2、WebSocket3、Http VS WebSocket4、WebSocket - 建立连接5、服务端推送Web方案(1) 短轮询(2) 长轮询(3) WebSocket长连接1、HTTP和WebSocket协议 📕 HTTP请求的特点:通信只能由客户端发起。所以,早期很多网站为了实现推送技…