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

拦截器和过滤器

关于过滤器和拦截器,一直容易混乱,小记一下。

 对比

  • Filter是servlet的规范,是web三大组件之一(Servlet,Filter,Listener),不依赖于spring;
  • 拦截器是一些框架中的概念,比如:Spring,用于拦截请求和响应的处理过程。拦截器通常是在Spring MVC的上下文中使用的,提供了对控制器(Controller)方法的拦截能力
  • 过滤器和拦截器功能类似,都是对请求预处理和拦截,
  • 都是链式的,Filter没有执行chain.doFilter或者拦截器的prehandler没有返回true,请求不再继续传递。

过滤器

在spring中,过滤器可以通过继承OncePerRequestFilter

@Order(998)
@Component
public class MyFilter01 extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {System.out.println("自定义Filter01");filterChain.doFilter(request,response);}
}

实现源生Filter

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
public class TraceIdFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化代码(如果需要)}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;String traceId = httpRequest.getHeader("Trace-ID");if (traceId == null || traceId.isEmpty()) {traceId = UUID.randomUUID().toString();}TraceIdHolder.setTraceId(traceId);httpResponse.setHeader("Trace-ID", traceId);try {chain.doFilter(request, response);} finally {TraceIdHolder.clear();}}@Overridepublic void destroy() {// 销毁代码(如果需要)}
}// 注册
@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<TraceIdFilter> traceIdFilter() {FilterRegistrationBean<TraceIdFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new TraceIdFilter());registrationBean.addUrlPatterns("/*"); // 过滤所有路径return registrationBean;}
}

拦截器

拦截器可以实现HandlerInterceptor接口(需要注册)

//定义
public class MyInterceptor01 implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("自定义拦截器01");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
// 注册
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor02()).order(667);registry.addInterceptor(new MyInterceptor01()).order(666);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 抽象代数精解【9】
  • C# 设计模式六大原则之依赖倒置原则
  • MySQL的简单介绍
  • nuclei-快速漏洞扫描器【安装使用详解】
  • 鸿蒙AI功能开发【人脸活体验证控件】 机器学习-场景化视觉服务
  • 前端发版(发包)缓存,需要强制刷新问题处理
  • git版本控制的底层实现
  • Flink 实时数仓(四)【DWD 层搭建(二)流量域事实表】
  • enq: HW - contention事件来啦
  • fme从json中提取位置到kml中
  • react引入高德地图并初始化卫星地图
  • 【Go - 编译:浅尝辄止 】
  • 华为云全域Serverless技术创新:全球首创通用Serverless平台被ACM SIGCOMM录用
  • Android进阶之路 - 解决WebView加载H5时软键盘遮挡输入框问题
  • python的多线程
  • 【知识碎片】第三方登录弹窗效果
  • 78. Subsets
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • FineReport中如何实现自动滚屏效果
  • golang 发送GET和POST示例
  • iOS编译提示和导航提示
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JS专题之继承
  • mongo索引构建
  • Node + FFmpeg 实现Canvas动画导出视频
  • rc-form之最单纯情况
  • Redis中的lru算法实现
  • Spark RDD学习: aggregate函数
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 浮现式设计
  • 三分钟教你同步 Visual Studio Code 设置
  • 算法-图和图算法
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 原生Ajax
  • puppet连载22:define用法
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #微信小程序:微信小程序常见的配置传旨
  • (55)MOS管专题--->(10)MOS管的封装
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (python)数据结构---字典
  • (ZT)一个美国文科博士的YardLife
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十八)SpringBoot之发送QQ邮件
  • (四)鸿鹄云架构一服务注册中心
  • (转)编辑寄语:因为爱心,所以美丽
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET 的程序集加载上下文
  • .NetCore部署微服务(二)