详解拦截器和过滤器
目录
- 代码演示
- 过滤器Demo
- 拦截器Demo
- 过滤器
- 自定义拦截器
- 配置拦截器
- 过滤器执行原理
- 多个过滤器的执行顺序
- 拦截器
- 自定义拦截器
- 注册拦截器
- 1)注册拦截器
- 2)配置拦截的路径
- 3)配置不拦截的路径
- 多个拦截器的执行顺序
- 过滤器和拦截器的区别
代码演示
我们这里先上代码,看看拦截器和过滤器在代码实现上的区别。
过滤器Demo
1、定义一个类,实现接口Filter
public class FilterDemo implements Filter {
}
2、实现Filter接口的方法
public class FilterDemo implements Filter {public static int i = 0;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("执行init方法");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("执行doFilter方法 + " + i++);filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {System.out.println("执行destroy方法");}
}
3、配置拦截路径
1)通过web.xml文件配置
<filter><filter-name>FilterDemo</filter-name><filter-class>com.example.springboot_demo.filter.FilterDemo</filter-class>
</filter><filter-mapping><filter-name>FilterDemo</filter-name><!-- 拦截路径 --><url-pattern>/*</url-pattern>
</filter-mapping>
2)、注解
@WebFilter("/*")
拦截器Demo
1、定义一个类实现HandlerInterceptor 并实现此接口的方法
public class InterceptorDemo implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("执行preHandle方法");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("执行postHandle方法");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("执行afterCompletion方法");}
}
2、创建一个配置类,实现WebMvcConfigurer
@Configuration
public class MyConfig implements WebMvcConfigurer {}
3、实现WebMvcConfigurer 的addInterceptors方法
@Configuration
public class MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {}
}
4、将自定义的拦截器进行注册,并配置拦截路径和放行路径
@Configuration
public class MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册自定义的拦截器InterceptorRegistration interceptorRegistration = registry.addInterceptor(new InterceptorDemo());// 定义拦截所有路径interceptorRegistration.addPathPatterns("/**");// 定义排查/user/下的所有路径interceptorRegistration.excludePathPatterns("/user/**");}
}
这就是过滤器和拦截器的代码实现,展示了它们在代码层面的不同。后面将会进行详细解释。
过滤器
过滤器是Servlet的高级特性之一,就是Web服务器在处理请求的时候会经过每一过滤器再处理请求。

自定义拦截器
自定义拦截器其实就是实现Filter接口,然后实现他的方法。
那它的方法都有什么作用呢?
1)init方法
public void init(FilterConfig filterConfig)
- 在Web容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。
- 注意:这个方法必须执行成功,否则过滤器会不起作用。
2)doFilter方法
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
- 容器中的每一次请求都会调用该方法
- 一次请求会调用两次,进Web容器时调用一次,出Web容器时调用一次
- 要使用
filterChain.doFilter(servletRequest, servletResponse);来调用下一个过滤器,否则这个请求就到此结束了。
3)destroy方法
public void destroy()
- 当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源
- 在过滤器 Filter 的整个生命周期也只会被调用一次
public class FilterDemo implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("执行init方法");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("执行doFilter方法");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {System.out.println("执行destroy方法");}
}
配置拦截器
1)通过web.xml文件配置
<filter><filter-name>FilterDemo</filter-name><filter-class>com.example.springboot_demo.filter.FilterDemo</filter-class>
</filter>
- <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
- <filter-class>元素用于指定过滤器的完整的限定类名。
- <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping><filter-name>FilterDemo</filter-name><!-- 拦截路径 --><url-pattern>/*</url-pattern>
</filter-mapping>
- <filter-mapping>元素用于设置一个Filter 所负责拦截的资源。
- <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字。
- <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
2)、注解
@WebFilter(filterName = "FilterDemo",urlPatterns = "/*")
- 理解了web.xml方式,注解方式看起来就一目了然了
过滤器执行原理
过滤器执行主要是通过函数回调的方式。
在我们自定义的过滤器中都会实现一个 doFilter()方法,这个方法有一个FilterChain 参数,而实际上它是一个回调接口。

所以,如果我们写这样的过滤器
public class FilterDemo implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("执行init方法");}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("准备放行");//执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源)chain.doFilter(req, resp);System.out.println("放行完成");}@Overridepublic void destroy() {System.out.println("执行destroy方法");}
}
程序在执行到chain.doFilter(req,resp)时会执行下一个过滤器或目标资源,然后执行完成回到此方法继续往下执行。
多个过滤器的执行顺序
过滤器之间的执行顺序看在web.xml文件中mapping的先后顺序的,如果放在前面就先执行,放在后面就后执行!
如果是通过注解的方式配置,就比较urlPatterns的字符串优先级
拦截器
拦截器是SpringMVC自己的功能,虽然看起来和过滤器一样,但是底层使用的是面向切面编程AOP。
自定义拦截器
前面我们直到自定义拦截器要实现HandlerInterceptor接口,然后再实现它的方法。
那这几个方法都有什么作用呢?
1)preHandle方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler);
- 再请求处理之前执行(Controller方法调用之前)
- 返回值是boolean类型,返回false表示拦截,不会让此请求访问Controller,返回true则可继续执行
2)postHandle方法
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView);
- 在请求结束之后(Controller请求返回),在ModelAndView渲染之前调用
- 主要就是用来对ModelAndView对象进行操作
3)afterCompletion方法
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
- 在整个请求结束之后调用
- 主要是用于资源清理工作
public class InterceptorDemo implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("执行preHandle方法");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("执行postHandle方法");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("执行afterCompletion方法");}
}
注册拦截器
创建一个实现WebMvcConfigurer的拦截器,然后将自定义的拦截器注册到其中。可以注册多个拦截器。
实现方法addInterceptors,通过参数InterceptorRegistry registry来进行一系列配置
@Configuration
public class MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册自定义的拦截器InterceptorRegistration interceptorRegistration = registry.addInterceptor(new InterceptorDemo());// 定义拦截所有路径interceptorRegistration.addPathPatterns("/**");// 定义排查/user/下的所有路径interceptorRegistration.excludePathPatterns("/user/**");// 确定执行顺序interceptorRegistration.order(1);}
}
1)注册拦截器
InterceptorRegistration interceptorRegistration = registry.addInterceptor(new InterceptorDemo());
将自定义的拦截器对象传入其中即可,如果要注册多个拦截器,调用多次这个方法即可。
2)配置拦截的路径
interceptorRegistration.addPathPatterns("/**");
如果需要拦截多个路径,可以多次传入一个字符串,也可以传入一个List集合。

3)配置不拦截的路径
interceptorRegistration.excludePathPatterns("/user/**");
这个和addPathPatterns一样,可以传入字符串,也可以传入List

多个拦截器的执行顺序

多个拦截器可通过
order()方法来确定执行顺序,order()传入一个数字,数字越小则越先执行。
过滤器和拦截器的区别
- 适用范围不同:Filter是Servlet容器规定的,只能使用在servlet容器中,而拦截器的使用范围就大得多
- 使用的资源不同:拦截器是属于spring的一个组件,因此可以使用spring的所有对象,如service对象,数据源,事务控制等,而过滤器就不行
- 深度不同:Filter还在servlet前后起作用。而拦截器能够深入到方法前后,异常抛出前后,因此拦截器具有更大的弹性,所有在spring框架中应该优先使用拦截器

相关文章:
详解拦截器和过滤器
目录 代码演示过滤器Demo拦截器Demo 过滤器自定义拦截器配置拦截器过滤器执行原理多个过滤器的执行顺序 拦截器自定义拦截器注册拦截器1)注册拦截器2)配置拦截的路径3)配置不拦截的路径 多个拦截器的执行顺序 过滤器和拦截器的区别 代码演示 …...
关于`IRIS/Caché`进程内存溢出解决方案
文章目录 关于IRIS/Cach进程内存溢出解决方案 描述原因相关系统变量$ZSTORAGE$STORAGE 什么情况下进程内存会变化?内存不足原理解决方案 关于 IRIS/Cach进程内存溢出解决方案 描述 在IRIS/Cach中,进程内存溢出错误是指一个进程(例如运行中的…...
构建Docker容器监控系统(cadvisor+influxDB+grafana)
目录 一、部署 1、安装docker-cd 2、阿里云镜像加速 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、创建granafa容器 一、部署 1、安装docker-cd [rootlocalhost ~]# iptables -F [rootlocalhost ~]# setenforce 0 setenforce: SELi…...
最强自动化测试框架Playwright(17)- 模拟接口
模拟接口 介绍 Web API 通常作为 HTTP 终结点实现。Playwright提供了API来模拟和修改网络流量,包括HTTP和HTTPS。页面所做的任何请求,包括 XHR 和获取请求,都可以被跟踪、修改和模拟。使用Playwright,您还可以使用包含页面发出的…...
Python爬虫——requests_get请求
import requests# ?可加可不加 url http://www.baidu.com/s?headers {Cookie: ,User-Agent: , }data {wd: 北京 } # params 参数 response requests.get(urlurl, paramsdata, headersheaders)content response.text print(content)总结: 参数使用params传递…...
【EI复现】一种建筑集成光储系统规划运行综合优化方法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
C++11 异步与通信之 std::async
概念简介 std::async 异步运行一个函数,将返回值保存在std::future中。 含有2个策略参数: launch::deferred 延迟执行,当调用wait()和get()时,任务才会被运行,且不创建线程;launch::async : 创建线程并执…...
影视站用什么cms好?
影视站是指用于提供电影、电视剧、综艺等视频资源的网站。由于影视站需要频繁更新大量的内容,因此使用一个好的内容管理系统(CMS)非常重要。以下是几个受欢迎的影视站CMS的介绍。最新下载地址:roulang WordPress WordPress是目前…...
HOT88-乘积最大子数组
leetcode原题链接:乘积最大子数组 题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。子数组 是…...
工博士与纷享销客达成战略合作,开启人工智能领域合作新篇章
近日,工博士与纷享销客在上海正式签署了战略合作协议,正式拉开了双方在人工智能与数字营销领域的合作序幕。这次合作将为双方带来更多机遇和发展空间,并为全球人工智能领域的客户提供更高效、智能的CRM解决方案。 < 双方项目人员合影 >…...
拆解与重构:慕云游首页组件化设计
目录 前言1 项目准备1.1 创建项目目录1.2 搭建项目开发环境 2 项目组件化2.1 在当前环境启动原有项目2.2 顶部组件2.3 幻灯片组件2.4 机酒自由行组件2.5 拆分余下的css文件 3 项目完善3.1 幻灯片组件3.1.1 结构和样式3.1.2 功能实现3.1.3 使用Ajax获取数据3.1.4 加载中组件 3.2…...
刷了3个月的华为OD算法题,刷出感觉了,如洁柔般丝滑,文末送《漫画算法2:小灰的算法进阶》
目录 一、考研二战,入职华为,反向调剂电子科大深圳下面分享一道2023 B卷 朋友抽中题 简易内存池:二、题目描述三、输入描述四、输出描述样例:输出样例: 五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明…...
ip转换器哪个好用 ip地址切换器有哪些
在互联网时代,IP转换器成为了实现高效工作的常见工具。而如今,市面上涌现出了众多的IP转换器软件,使得用户在选择时感到困惑。本文将介绍一种深度IP转换器软件,探讨其特点和优势,以及与其他软件相比的差异,…...
【python】爬取豆瓣电影Top250(附源码)
前言 在网络爬虫的开发过程中,经常会遇到需要处理一些反爬机制的情况。其中之一就是网站对于频繁访问的限制,即IP封禁。为了绕过这种限制,我们可以使用代理IP来动态改变请求的来源IP地址。在本篇博客中,将介绍如何使用代理IP的技术…...
35岁职业危机?不存在!体能断崖?不担心
概述 90年,硕士毕业,干了快8年的Java开发工作。现年33岁,再过2年就要35岁。 工作这些年,断断续续也看过不少35岁找不到工作,转行,降薪入职的传闻、案例。 35岁,甚至30岁之后,体能…...
C语言——指针进阶
本章重点 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析 1. 字符指针 在指针的类型中我们知道有一种指针类型为字符指针 char* int main() { char ch w; char *pc &ch; *pc w; return 0; }…...
heap pwn 入门大全 - 1:glibc heap机制与源码阅读(上)
本文为笔者学习heap pwn时,学习阅读glibc ptmalloc2源码时的笔记,与各位分享。可能存在思维跳跃或错误之处,敬请见谅,欢迎在评论中指出。本文也借用了部分外网和其他前辈的素材图片,向各位表示诚挚的感谢!如…...
树莓派RP2040 用Arduino IDE安装和编译
目录 1 Arduino IDE 1.1 IDE下载 1.2 安装 arduino mbed os rp2040 boards 2 编程-烧录固件 2.1 打开点灯示例程序 2.2 选择Raspberry Pi Pico开发板 2.3 编译程序 2.4 烧录程序 2.4.1 Raspberry Pi Pico开发板首次烧录提示失败 2.4.2 解决首次下载失败问题 2.4.2.1…...
云安全攻防(八)之 Docker Remote API 未授权访问逃逸
Docker Remote API 未授权访问逃逸 基础知识 Docker Remote API 是一个取代远程命令行界面(rcli)的REST API,其默认绑定2375端口,如管理员对其配置不当可导致未授权访问漏洞。攻击者利用 docker client 或者 http 直接请求就可以…...
2023-08-13 LeetCode每日一题(合并两个有序数组)
2023-08-13每日一题 一、题目编号 88. 合并两个有序数组二、题目链接 点击跳转到题目位置 三、题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 …...
Qwen-Image-2512-SDNQ功能体验:负面提示词、宽高比调节等高级选项实测
Qwen-Image-2512-SDNQ功能体验:负面提示词、宽高比调节等高级选项实测 1. 开篇:当AI绘画遇上专业级控制 在AI绘画工具泛滥的今天,真正能让创作者感到"趁手"的解决方案却不多见。大多数工具要么功能过于简单,要么参数复…...
迎接范式革命:最新、最全的大模型Latent Space综述,NUS、复旦、清华等联合出品
从 2024 年底的关于潜在空间的早期探索,再到 2025 年底和 2026 年初的相关研究爆发,潜空间范式正在彻底重塑大模型 (LLMs, VLMs, VLAs 等延伸模型) 的底层设计逻辑。当大部分大模型还在依靠显式空间 (Explicit Space) 或者说语言空间 (Verbal Space) 完成…...
3个实用技巧:如何用ncmdump轻松解密网易云音乐NCM文件
3个实用技巧:如何用ncmdump轻松解密网易云音乐NCM文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密文件无法在其他播放器播放而烦恼吗?今天,我将为你介绍一款简单…...
【论文求生帖】AIGC检测又爆红?2026.4全网最全:国内外10大免费降AI率工具避坑指南
不知不觉间,2026年已经过去三分之一了,各大高校的查重系统也逐步部署好了。 其中最让人头痛的AIGC检测已经从“查不查”变成“查多严”了——知网去年底刚完成新一轮算法升级,检测识别能力直接拉升了15-18个百分点,不少同学去年底…...
立知-lychee-rerank-mm详细步骤:日志排查、重启、调试全流程
立知-lychee-rerank-mm详细步骤:日志排查、重启、调试全流程 1. 引言:当重排序模型“罢工”时 想象一下这个场景:你正在搭建一个智能问答系统,用户上传了一张“金毛犬在草地上奔跑”的图片,并问“这是什么品种的狗&a…...
办公效率翻倍:巧用WPS邮件合并,零代码搞定数据写入
一、问题的提出和分析我采用网络插件爬取某网页10余篇双语文章,如下图所示。我想把表格中的题目和内容写入到WPS文字当中,便于查看。首先,我想到的是采用Python读取表格写入到文本的方法,但是这种方法需要下载Python解释器&#x…...
部署Doris存算一体集群
部署Doris存算一体集群 1. 下载 doris安装包 https://doris.apache.org/zh-CN/download 2. 安装jdk(所有节点执行) 2.1 解压 tar -zxvf jdk-17.0.17_linux-x64_bin.tar.gz -C /data/java配置环境变量 vim /etc/profile增加如下配置 export JAV…...
类比前端知识来学习Java的Spring Boot实现MySql的全栈CRUD功能——搭配Svelte+Vite
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
MogFace-large多场景应用:直播美颜预处理、AI考勤系统集成案例
MogFace-large多场景应用:直播美颜预处理、AI考勤系统集成案例 1. 引言 你有没有遇到过这样的场景?在直播时,美颜滤镜总是识别不准你的脸,导致效果时好时坏;或者公司用的人脸考勤机,在光线稍暗或角度偏一…...
Windows 安装 DeerFlow 2.0
今天有空尝试了下最近很火来自字节开源的 DeerFlow,这框架在 Linux 下安装会顺利很多,只是公司开发电脑是 Windows 11 版本的,所以本地安装折腾了一番功夫才安装上,中间放弃了 2 次不想装了,做其他事去了,做…...
