当前位置: 首页 > news >正文

过滤器、监听器、拦截器的区别

过滤器、监听器、拦截器的区别

  • 过滤器(filter)、监听器(Listener)是JavaWeb的三大组件。
  • 而拦截器(Interceptor)是Spring框架中的。

我们主要是要分清除过滤器和拦截器的区别:

  1. 实现原理:过滤器是基于函数回调实现的,而拦截器是基于java的反射机制
  2. 使用范围:过滤器Filter的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。而拦截器是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
  3. 触发时机:![[Pasted image 20240602162705.png]]
    ![[Pasted image 20240602162846.png]]
    从图中我看可以看出,过滤器Filter是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。而拦截器Interceptor是在请求进入servlet后,在进入Controller之前进行预处理的,Controller中渲染了对应的视图之后请求结束。

执行顺序

配置Filter:

package com.qcby.demo.config;import org.springframework.stereotype.Component;import javax.servlet.*;
import java.io.IOException;@Component
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Filter 前置过滤");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter 处理中");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.out.println("Filter 后置过滤");}
}

自定义拦截器

package com.qcby.demo.config;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Interceptor 前置拦截");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Interceptor 后置拦截");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Interceptor 最终拦截");}
}

配置拦截器

package com.qcby.demo.config;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 MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 设置要拦截的.excludePathPatterns("/test1");// 设置不拦截的}
}

控制器

package com.qcby.demo;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("test")
public class TestController {@GetMapping("/test1")public String test() {return "123456";}
}

项目启动之后,我们会发现过滤器的init()方法,随着容器的启动进行了初始化:
![[Pasted image 20240602182638.png]]

然后浏览器访问对应的端口号:http://localhost:8080/test/test1,会有以下输出:
![[Pasted image 20240602185048.png]]

这样就验证了我们前边的过滤器和拦截器的触发顺序。
对于拦截器的触发时机,在只有一个拦截器时:
![[Pasted image 20240602185232.png]]

有多个拦截器时
![[Pasted image 20240602185303.png]]

过滤器的应用场景

  1. 过滤敏感词汇(防止sql注入)
  2. 设置字符编码
  3. URL级别的权限访问控制
  4. 压缩响应信息

拦截器的应用场景

  1. 登录验证,判断用户是否登录。
  2. 权限验证,判断用户是否有权限访问资源,如校验token
  3. 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
  4. 处理cookie、本地化、国际化、主题等。
  5. 性能监控,监控请求处理时长等。
  6. 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

参考文献

  • Springboot——拦截器
  • 过滤器 和 拦截器的 6个区别,别再傻傻分不清了

相关文章:

  • 格式化数据恢复指南:从备份到实战,3个技巧一网打尽
  • pycharm 上一次编辑位置不见了
  • AI时代下的智能商品计划管理
  • Love-Yi情侣网站3.0存在SQL注入漏洞
  • 如何在路由器上安装代理服务:详细教程
  • redis笔记1
  • 在 Qt Creator 上创建 ROS 项目并新建/导入 ROS 包
  • 探究MySQL中的“树”结构
  • 【TensorFlow深度学习】卷积层变种与深度残差网络原理
  • Java——二进制原码、反码和补码
  • xmake+xrepo自建仓库添加交叉编译工具链
  • 『大模型笔记』FlashAttention: 具有IO意识的快速且内存高效的精确注意力机制!
  • C++17新特性
  • bootstrapblazor小白笔记
  • 面试题--this关键字
  • __proto__ 和 prototype的关系
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTML5新特性总结
  • Java 23种设计模式 之单例模式 7种实现方式
  • Joomla 2.x, 3.x useful code cheatsheet
  • mysql 5.6 原生Online DDL解析
  • Python_OOP
  • React+TypeScript入门
  • Web标准制定过程
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 二维平面内的碰撞检测【一】
  • 老板让我十分钟上手nx-admin
  • 浅谈Golang中select的用法
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 微服务入门【系列视频课程】
  • MPAndroidChart 教程:Y轴 YAxis
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #565. 查找之大编号
  • #define用法
  • ${ }的特别功能
  • $NOIp2018$劝退记
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (function(){})()的分步解析
  • (Java数据结构)ArrayList
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (实战篇)如何缓存数据
  • (四)c52学习之旅-流水LED灯
  • (算法)N皇后问题
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)linux下的时间函数使用
  • (转)用.Net的File控件上传文件的解决方案
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .bat批处理出现中文乱码的情况
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args