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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ApiJson简单使用

前言 最近在正式迭代中插入了一个大屏演示项目&#xff0c;因为后端开发人员任务都安排满了&#xff0c;而演示项目逻辑比较简单&#xff0c;大多是直接查表就能搞定&#xff0c;所以只能想办法让前端直接和数据库交互&#xff0c;增加开发速度。在找工具时发现了ApiJson。尝试…

详解redis单线程设计思路

写在文章开头 我们都知道redis是一个基于单线程实现高效网络IO和键值对读写操作的内存数据库,本文将从源码的角度剖析一下redis高效的单线程设计。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一…

基于.NetCore和ABP.VNext的项目实战六:JWT

添加小绿锁,Nuget包下载Swashbuckle.AspNetCore.Filters,在扩展方法AddSwagger(this IServiceCollection services)中调用。 public static IServiceCollection AddSwagger(this IServiceCollection services){return services.AddSwaggerGen(options =>{...var security …

Mac电脑重置网络命令

在Mac电脑上重置网络设置可以通过终端命令来实现。以下是几种方法&#xff0c;包括刷新DNS缓存、重置网络接口&#xff0c;以及重置Wi-Fi设置。 刷新DNS缓存 要刷新DNS缓存&#xff0c;可以使用以下命令&#xff1a; sudo dscacheutil -flushcache; sudo killall -HUP mDNSR…

一键生成迷宫-Word插件-大珩助手新功能

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】迷宫生成器 1、可自定义迷宫大小&#xff1b; …

jQuery写轮播图

用jQuery做轮播&#xff0c;代码比js少了很多&#xff0c;具体实现和效果看如下展示。 轮播图-jQuery 友情提示&#xff1a;写代码前准备好照片素材和jQuery包。 详细代码展示&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"…

topK 问题

topK 问题 topK二、实验内容三、数据结构设计四、算法设计五、运行结果六、程序源码 topK &#xff08;1&#xff09;实验题目 topK 问题 &#xff08;2&#xff09;问题描述 从大批量数据序列中寻找最大的前 k 个数据&#xff0c;比如从 10 万个数据中&#xff0c;寻找最大的…

conda使用

因为时不时搜索conda操作&#xff0c;就想着逐步将先前的conda使用整理在一起&#xff0c;并添加新的内容。 目录 0.简介1.常用操作场景1.1 取消终端conda自动启动 0.简介 1.常用操作场景 1.1 取消终端conda自动启动 安装conda后取消命令行前出现的base&#xff0c;取消每次…

论文阅读《SELECTIVE DOMAIN-INVARIANT FEATURE FOR GENERALIZABLE DEEPFAKEDETECTION》

作者&#xff1a;Yingxin Lai、 Guoqing Yang1、Yifan He2、Zhiming Luo、Shaozi Li 期刊&#xff1a;ICASSP-2024 目的&#xff1a;解决泛化性的问题&#xff0c;提出了3个模块 论文整体的架构图&#xff1a;&#xff08;挑选域特征不变&#xff0c;减少对图像内容或者风格…

Java面试八股之怎么降低锁竞争

怎么降低锁竞争 减少锁的持有时间&#xff1a; 尽量缩短线程持有锁的时间&#xff0c;只在必要时才获取锁&#xff0c;一旦操作完成立即释放锁。可以通过将同步代码块的范围缩小到最小必要程度来实现&#xff0c;避免在锁保护的代码块中执行耗时操作或等待操作&#xff0c;比如…

HTML+CSS+JS 选项卡导航栏

效果演示 实现了一个导航栏切换内容的效果。页面上方有一个导航栏,每个导航项都有一个圆形背景,点击导航项时,圆形背景会放大并显示对应的内容。每个内容区域都包含一个大号字母,数字会在内容区域显示时淡入。点击其他导航项时,当前内容区域会淡出并隐藏,同时新的内容区域…

JVM之【GC-可达性分析算法】

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;可达性分析算法&#xff08;Reachability Analysis&#xff09;用于垃圾收集&#xff0c;以确定哪些对象是“可达”的&#xff0c;即哪些对象仍然有用&#xff0c;哪些对象可以被回收。下面是对可达性分析算法及其底层实…

Docker 基础使用(2) 镜像与容器

文章目录 镜像的含义镜像的构成镜像的作用镜像的指令容器的含义容器的状态容器的指令 Docker 基础使用&#xff08;0&#xff09;基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使用&#xff08;2&#xff09; 镜像与容器 Docker 基础使用&#xff08;3&#xff09; 存…

【热点】老黄粉碎摩尔定律被,量产Blackwell解决ChatGPT耗电难题

6月3日&#xff0c;老黄又高调向全世界秀了一把&#xff1a;已经量产的Blackwell&#xff0c;8年内将把1.8万亿参数GPT-4的训练能耗狂砍到1/350&#xff1b; 英伟达惊人的产品迭代&#xff0c;直接原地冲破摩尔定律&#xff1b;Blackwell的后三代路线图&#xff0c;也一口气被…

【动手学深度学习】多层感知机模型选择、欠拟合和过拟合研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 多层感知机模型选择、⽋拟合和过拟合 &#x1f30d;3.2 基础练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 多层感知机模型选择&#xff1a;比较不同多层…

使用Python绘制南丁格尔图(玫瑰图)

使用Python绘制南丁格尔图&#xff08;玫瑰图&#xff09; 南丁格尔图效果代码 南丁格尔图 南丁格尔图&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;也被称为玫瑰图或极区图&#xff0c;是一种特殊的圆形统计图&#xff0c;用于显示多个类别的数据。它是由弗洛…

基于聚类和回归分析方法探究蓝莓产量影响因素与预测模型研究

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 目录 背景数据说明数据来源思考 正文数据预处理数据读取数据预览数据处理 相关性分析聚类分析数据处理确定聚类数建立k均值聚类模型 多元线性回…

C++ Primer Chapter 1 Getting Started

Chapter 1 Getting Started 1.2 初识输入输出 输出运算符&#xff08;<<&#xff09; <<运算符接受两个运算对象&#xff1a;左侧的运算对象必须是一个ostream对象&#xff0c;右侧的运算对象是要打印的值。 此运算符将给定的值写到给定的ostream对象中。输出运算…

Codeforces Round 950 (Div. 3) 个人题解 (A~F1)

Codeforces Round 950 (Div. 3)个人题解(A~F1) 题解火车头 #define _CRT_SECURE_NO_WARNINGS 1#include <iostream> #include <vector> #include <algorithm> #include <set> #include <unordered_map> #include <cstring> #include <…

小程序集arcgis地图显示自定义坐标的功能实现记录!(学习笔记)

最近再做一个新能源回收项目&#xff0c;项目中有个根据回收点坐标数据显示区域内回收点位置&#xff0c;点击图标直接导航到该位置&#xff0c;及分布的需求&#xff0c;研究了一下&#xff0c;实现效果如下&#xff0c;实现起来很简单&#xff0c;代码及效果 回收点位置及分…