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

OncePerRequestFilter详解

OncePerRequestFilter是什么

OncePerRequestFilter是Spring框架提供的一个过滤器,确保在一次HTTP请求期间只执行一次特定的过滤器逻辑。它继承了GenericFilterBean类,并实现了javax.servlet.Filter接口。在Spring框架中,过滤器是一种拦截器,用于在请求到达目标资源之前或之后执行一些操作。OncePerRequestFilter是一种特殊的过滤器,确保在一次请求中只执行一次过滤器的逻辑。

OncePerRequestFilter跟普通Filter的最大区别就是执行次数,OncePerRequestFilter可以确保在一次HTTP请求期间只执行一次特定的过滤器,避免过滤器多次执行的问题。

servlet filter 为啥会多次执行

在servlet2.3中,Filter会经过一切请求,包括服务器内部使用的forward转发请求和<%@ include file=”/login.jsp”%>的情况

servlet2.4中的Filter默认情况下只过滤外部提交的请求,forward和include这些内部转发都不会被过滤

OncePerRequestFilter使用

使用OncePerRequestFilter,创建一个类继承OncePerRequestFilter,然后注册到spring即可

//order表示优先级,数字越小,优先级越高
@Order(0)
@Component
public class MyFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {//执行你的过滤逻辑System.out.println("执行过滤逻辑");// 继续处理请求filterChain.doFilter(httpServletRequest, httpServletResponse);}/*** 可以过滤一些不需要过滤的请求* @return*/@Overrideprotected boolean shouldNotFilterAsyncDispatch() {return super.shouldNotFilterAsyncDispatch();}
}

注册过滤器的方式

1、Filter 实现类 + @WebFilter + 启动类添加@ServletComponentScan:正常urlpattern的Filter

2、Filter 实现类 + FilterRegistrationBean构造 + @Configuration:正常urlpattern的Filter,并且可以设置Order

3、仅仅 Filter实现类 + @Component :会注册一个urlpattern 为 /*的过滤器

onceperrequestfilter的应用场景

onceperrequestfilter的应用场景比较广泛,但主要是为了有效地控制过滤器的执行次数,对程序性能优化有很好的作用。

举个例子,在Web开发中,我们经常使用过滤器来实现一些通用的控制功能,例如登录验证、权限认证、字符编码转换等。但是,如果每次请求都执行这些过滤器,无论是否需要,都会浪费一定的资源和时间。通过使用onceperrequestfilter,我们可以实现过滤器在同一次请求中只执行一次的效果,提高程序性能。

http://www.lryc.cn/news/229563.html

相关文章:

  • Accelerate 0.24.0文档 二:DeepSpeed集成
  • 【系统架构设计】架构核心知识: 2.3 UML图
  • 2023年09月青少年软件编程(C语言)等级考试试卷(三级)
  • SQLite3 数据库学习(一):数据库和 SQLite 基础
  • 上机4KNN实验4
  • 产品经理如何保持核心竞争力?学会这些方法
  • 终知人生苦短,何必自我为难
  • C++阶段复习‘‘‘‘总结?【4w字。。。】
  • 嵌入式行业算青春饭吗?
  • 【C++】非类型模板参数 | array容器 | 模板特化 | 模板为什么不能分离编译
  • 解决 Django 开发中的环境配置问题:Windows 系统下的实战指南20231113
  • C语言仅凭自学能到什么高度?
  • Python爬虫过程中DNS解析错误解决策略
  • vue devtools 调试工具安装配置
  • kube-bench-CIS基准的自动化扫描工具学习
  • springboot(ssm 拍卖行系统 在线拍卖平台 Java(codeLW)
  • go语言rpc初体验
  • 嵌入式LINUX——环境搭建 windows、虚拟机、开发板 互ping
  • 评论:AlexNet和CaffeNet有何区别?
  • 什么是 IT 资产管理(ITAM),以及它如何简化业务
  • git快速上传代码
  • stable diffusion comfyui的api使用教程
  • Swift中的strong, weak, unowned
  • Linux命令——ssh
  • 在qml中,text如何左对齐,对齐方式有哪些?如何换行?
  • 【Rust 易学教程】第 1 天:Rust 基础,基本语法
  • Linux(命令)——结合实际场景的命令 查找Java安装位置命令
  • C语言基础 -- scanf函数的返回值及其应用
  • mac 安装 selenium + chrome driver
  • 【阿里云】函数计算 X 通义千问快速部署