news 2026/6/10 17:06:00

Spring 过滤器:OncePerRequestFilter 应用详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring 过滤器:OncePerRequestFilter 应用详解

在Web应用中,过滤器(Filter)是一个强大的工具,它可以在请求到达目标资源之前或响应返回客户端之前对请求或响应进行拦截和处理。然而,在某些情况下,我们可能希望确保过滤器逻辑在一次完整的HTTP请求中仅执行一次,即使请求在服务器内部经过了多次转发(forward)或包含多个资源请求。Spring框架的OncePerRequestFilter就是为了满足这一需求而设计的。

一、OncePerRequestFilter 概述

OncePerRequestFilter是Spring提供的一个过滤器基类,它确保了在一次完整的HTTP请求中,无论请求经过多少次内部转发,过滤器的逻辑都只会被执行一次。这对于需要在请求处理之前或之后进行一次性设置或清理资源的场景特别有用。

二、OncePerRequestFilter 的原理

OncePerRequestFilter通过内部使用HttpServletRequest的getAttribute和setAttribute方法,以及一个ThreadLocal变量来跟踪当前请求是否已经被处理过。当请求首次进入过滤器时,OncePerRequestFilter会检查是否已经存在一个与当前请求关联的标记。如果不存在,则执行过滤器的逻辑,并将一个标记与当前请求关联起来;如果已经存在,则直接跳过过滤器的逻辑。

三、OncePerRequestFilter 的使用

要使用OncePerRequestFilter,你需要创建一个类并继承它,然后重写doFilterInternal方法。doFilterInternal方法是实际执行过滤器逻辑的地方。

下面是一个简单的示例,展示了一个自定义的OncePerRequestFilter,它在请求到达目标资源之前记录请求的开始时间,并在响应返回客户端之前记录请求的处理时间:

import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class TimingFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 记录请求开始时间 long startTime = System.currentTimeMillis(); // 继续过滤器链 filterChain.doFilter(request, response); // 记录请求处理时间 long endTime = System.currentTimeMillis(); long duration = endTime - startTime; System.out.println("Request took " + duration + " ms to process"); } }

四、注册 OncePerRequestFilter

要将自定义的OncePerRequestFilter注册到Spring应用中,你可以使用Java配置或XML配置。在Java配置中,你可以创建一个FilterRegistrationBean的Bean来注册你的过滤器:

import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<TimingFilter> timingFilterRegistration() { FilterRegistrationBean<TimingFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new TimingFilter()); registration.addUrlPatterns("/*"); // 设置过滤器拦截的URL模式 return registration; } }

五、总结

OncePerRequestFilter是Spring框架中一个非常有用的工具,它可以帮助你在一次完整的HTTP请求中仅执行一次过滤器的逻辑。通过继承OncePerRequestFilter并重写doFilterInternal方法,你可以轻松地创建自定义的过滤器来处理各种需求。无论是在记录请求处理时间、设置请求属性、进行权限验证等方面,OncePerRequestFilter都能为你提供强大的支持。

参考文献:

  • https://springdoc.cn/spring-onceperrequestfilter/
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 2:53:19

PDF-Extract-Kit性能测试:处理1000页PDF的实战报告

PDF-Extract-Kit性能测试&#xff1a;处理1000页PDF的实战报告 1. 背景与测试目标 1.1 PDF智能提取的技术挑战 在科研、教育和出版领域&#xff0c;大量非结构化文档以PDF格式存在。传统方法依赖人工摘录或基础OCR工具&#xff0c;难以应对复杂版式中的表格、公式、图文混排…

作者头像 李华
网站建设 2026/6/10 12:55:26

BRAM在图像处理缓存中的实现:完整示例解析

BRAM在图像处理缓存中的实战设计&#xff1a;从原理到可综合代码你有没有遇到过这样的问题——明明FPGA的逻辑资源还很充裕&#xff0c;但图像处理流水线却频频卡顿&#xff1f;像素流断了、卷积核等数据、边缘检测结果延迟飙升……最终发现&#xff0c;瓶颈不在算法&#xff0…

作者头像 李华
网站建设 2026/6/10 14:43:50

腾讯混元翻译1.5:少数民族语言支持实战

腾讯混元翻译1.5&#xff1a;少数民族语言支持实战 随着全球化与多语言交流的不断深化&#xff0c;高质量、低延迟的机器翻译需求日益增长。尤其在民族地区和跨文化场景中&#xff0c;对小语种与方言变体的支持成为技术落地的关键瓶颈。腾讯近期开源的混元翻译大模型 HY-MT1.5…

作者头像 李华
网站建设 2026/6/10 14:53:04

PDF智能提取工具箱实战:手写公式转LaTeX完整步骤

PDF智能提取工具箱实战&#xff1a;手写公式转LaTeX完整步骤 1. 引言&#xff1a;从扫描文档到结构化数据的智能化跃迁 在科研、教学和工程实践中&#xff0c;PDF文档中常包含大量手写或印刷体数学公式、表格和文本内容。传统方式下&#xff0c;将这些非结构化信息转化为可编…

作者头像 李华
网站建设 2026/6/10 14:52:50

STM32烧录必备:STLink驱动下载与配置实战案例

STM32烧录不翻车&#xff1a;STLink驱动安装与配置全实战指南 你有没有遇到过这样的场景&#xff1f; 新买了一块Nucleo开发板&#xff0c;兴冲冲插上USB线准备下载第一个“Hello World”程序&#xff0c;结果STM32CubeIDE弹出一串红字&#xff1a;“No target connected”。 …

作者头像 李华
网站建设 2026/6/10 14:53:14

图解说明STLink驱动在Keil中的设置步骤

图解说明STLink驱动在Keil中的设置步骤&#xff1a;嵌入式开发调试关键技术解析 为什么你连不上STM32&#xff1f;从一个“无法下载程序”的坑说起 上周&#xff0c;一位刚接触STM32的开发者在群里发问&#xff1a;“我用Keil编译没问题&#xff0c;但一点击‘Download’就报…

作者头像 李华