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

spring通过RequestContextHolder获取HttpServletRequest对象

1.获取HttpServletRequest对象方法:
    public static HttpServletRequest getRequest() {ServletRequestAttributes attributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());assert attributes != null;return attributes.getRequest();}
2.RequestContextHolder是一个持有请求和响应上下文的对象,其持有如下两个ThreadLocal对象用于保存当前请求的上下文对象
    private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes");private static final ThreadLocal<RequestAttributes> inheritableRequestAttributesHolder = new NamedInheritableThreadLocal("Request context");

RequestContextHolder类中全部是静态方法,可以直接使用设置属性、清空属性相关方法;

3.RequestContextFilter过滤器用户设置和销毁当前上下文对象
public class RequestContextFilter extends OncePerRequestFilter {...protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {ServletRequestAttributes attributes = new ServletRequestAttributes(request, response);//初始化this.initContextHolders(request, attributes);try {filterChain.doFilter(request, response);} finally {//销毁this.resetContextHolders();if (this.logger.isTraceEnabled()) {this.logger.trace("Cleared thread-bound request context: " + request);}attributes.requestCompleted();}}private void initContextHolders(HttpServletRequest request, ServletRequestAttributes requestAttributes) {LocaleContextHolder.setLocale(request.getLocale(), this.threadContextInheritable);//初始化上下文属性RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable);if (this.logger.isTraceEnabled()) {this.logger.trace("Bound request context to thread: " + request);}}private void resetContextHolders() {LocaleContextHolder.resetLocaleContext();//销毁上下文属性RequestContextHolder.resetRequestAttributes();}
}
4.RequestContextFilter过滤器对象实例化
  • RequestContextFilter对象有一个子类OrderedRequestContextFilter
public class OrderedRequestContextFilter extends RequestContextFilter implements OrderedFilter {private int order = -105;public OrderedRequestContextFilter() {}public int getOrder() {return this.order;}public void setOrder(int order) {this.order = order;}
}
  • RequestContextFilter过滤器的实例化实际上是通过OrderedRequestContextFilter对象实例化实现

OrderedRequestContextFilter过滤器源码:

public class OrderedRequestContextFilter extends RequestContextFilter implements OrderedFilter {//过滤器执行优先级  private int order = -105;public OrderedRequestContextFilter() {}public int getOrder() {return this.order;}public void setOrder(int order) {this.order = order;}
}

OrderedRequestContextFilter过滤器实例化:

		@Bean@ConditionalOnMissingBean({ RequestContextListener.class, RequestContextFilter.class })@ConditionalOnMissingFilterBean(RequestContextFilter.class)public static RequestContextFilter requestContextFilter() {return new OrderedRequestContextFilter();}

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#requestContextFilter

5.OncePerRequestFilter过滤器

OncePerRequestFilter是Spring框架中一个抽象类,用于确保过滤器在每次请求中只通过一次,这是通过重写doFilterInternal方法来实现的,而不是通过重写doFilter方法。OncePerRequestFilter通过Spring的过滤器链管理来确保这一点。

6.RequestContextFilter在整个servlet容器中的顺序
  • CharacterEncodingFilter -2147483648
  • WebStaFilterRegistrationBean -2147483647
  • FormContentFilter -9900
  • RequestContextFilter(OrderedRequestContextFilter) -105

过滤器的顺序排序是在org.springframework.boot.web.servlet.ServletContextInitializerBeans#ServletContextInitializerBeans中进行:

    @SafeVarargspublic ServletContextInitializerBeans(ListableBeanFactory beanFactory, Class<? extends ServletContextInitializer>... initializerTypes) {this.initializerTypes = initializerTypes.length != 0 ? Arrays.asList(initializerTypes) : Collections.singletonList(ServletContextInitializer.class);this.addServletContextInitializerBeans(beanFactory);this.addAdaptableBeans(beanFactory);//对过滤器进行排序this.sortedList = this.initializers.values().stream().flatMap((value) -> {return value.stream().sorted(AnnotationAwareOrderComparator.INSTANCE);}).toList();this.logMappings(this.initializers);}

开源 SDK:https://github.com/mingyang66/spring-parent

相关文章:

spring通过RequestContextHolder获取HttpServletRequest对象

1.获取HttpServletRequest对象方法&#xff1a; public static HttpServletRequest getRequest() {ServletRequestAttributes attributes ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());assert attributes ! null;return attributes.getRequest(…...

STM32编码器接口及编码器测速模板代码

编码器是什么&#xff1f; 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器&#xff0c;我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分&#xff0c;可以分为增量式编码器和绝对式编码器。 从编码器检测原理上来分&#xff0…...

qt QNetworkAccessManager详解

1、概述 QNetworkAccessManager是QtNetwork模块中的一个核心类&#xff0c;它允许应用程序发送网络请求并接收响应。该类是网络通信的基石&#xff0c;提供了一种方便的方式来处理常见的网络协议&#xff0c;如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用…...

部署 Vue 前端项目到 Linux

看看怎么把一个 Vue 3 项目部署到 Linux 服务器上。准备好你的咖啡&#xff0c;让我们愉快地度过这段部署时光&#xff01; 前期准备 确保你已经在本地构建了 Vue 3 项目&#xff0c;并生成了 dist 文件夹。 npm run build构建完成后&#xff0c;你将看到一个新鲜出炉的 dis…...

数据分析:探索数据背后的秘密与挑战

在当今这个数据驱动的时代&#xff0c;数据分析已成为各行各业不可或缺的一部分。从市场营销到金融风控&#xff0c;从医疗健康到智能制造&#xff0c;数据分析为企业决策提供了强有力的支持。然而&#xff0c;尽管其重要性日益凸显&#xff0c;数据分析的过程并非一帆风顺&…...

文本域设置高度 加上文字限制并show出来:

文本域设置高度 :rows"4" 加上文字限制并show出来&#xff1a; maxlength"30" show-word-limit 效果: <el-form-item label"产品备注" prop"remark"><el-input v-model"form.remark" type"textarea"…...

深入浅出:Gin框架-简介与API开发入门

深入浅出&#xff1a;Gin框架-简介与API开发入门 引言 Gin框架是基于Go语言的HTTP Web框架&#xff0c;凭借其简单易用、性能卓越和丰富的功能&#xff0c;成为构建高性能Web应用的理想选择。本文将深入浅出地介绍Gin框架的基础知识&#xff0c;并通过一个简单的案例&#xf…...

MySQL各种锁详解

什么是锁&#xff1f; 1.1 锁的解释 计算机协调多个进程或线程并发访问某一资源的机制。 1.2 锁的重要性 在数据库中&#xff0c;除传统计算资源&#xff08;CPU、RAM、I/O等&#xff09;的争抢&#xff0c;数据也是一种供多用户共享的资源。 如何保证数据并发访问的一致性&…...

海外的bug-hunters,不一样的403bypass

一种绕过403的新技术&#xff0c;跟大家分享一下。研究HTTP协议已经有一段时间了。发现HTTP协议的1.0版本可以绕过403。于是开始对lyncdiscover.microsoft.com域做FUZZ并且发现了几个403Forbidden的文件。 &#xff08;访问fsip.svc为403&#xff09; 在经过尝试后&#xff0…...

React 组件中 State 的定义、使用及正确更新方式

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中&#xff0c;state …...

Jenkins 的HTTP Request 插件为什么不能配置Basic认证了

本篇遇到的问题 还是因为Jenkins需要及其所在的OS需要升级&#xff0c;升级策略是在一台新服务器上安装和配置最新版本的Jenkins&#xff0c; 当前的最新版本是&#xff1a; 2.479.2 LTS。 如果需要这个版本的话可以在官方站点下载&#xff0c;也可以到如下地址下载&#xff1…...

8 Bellman Ford算法SPFA

图论 —— 最短路 —— Bellman-Ford 算法与 SPFA_通信网理论基础 分别使用bellman-ford算法和dijkstra算法的应用-CSDN博客 图解Bellman-Ford计算过程以及正确性证明 - 知乎 (zhihu.com) 语雀版本 1 概念 **适用场景&#xff1a;**单源点&#xff0c;可以有负边&#xff0…...

nginx不允许静态文件被post请求显示405 not allowed

在单独站点的配置文件中 添加error_page 405 200 $request_uri; 即可&#xff01;...

【c++笔试强训】(第三十二篇)

目录 数组变换&#xff08;贪⼼位运算&#xff09; 题目解析 讲解算法原理 编写代码 装箱问题&#xff08;动态规划-01背包&#xff09; 题目解析 讲解算法原理 编写代码 数组变换&#xff08;贪⼼位运算&#xff09; 题目解析 1.题目链接&#xff1a;数组变换__牛客网…...

shell脚本实战案例

文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑&#xff1a;在Windows系统写了一个脚本&#xff0c;比如上面&#xff0c;随后上传到服务&#xff0c;执行会报错 原因&#xff1a; 解决方案&#xff1a;在linux系统touch文件&#xff0c;并通过vim添加内容&…...

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…...

lvgl9 Line(lv_line) 控件使用指南

文章目录 前言主体1. **Line 控件概述**2. **使用场景**3. **控件的样式**4. **设置点**5. **自动大小**6. **y 坐标反转**7. **事件处理**8. **示例代码** 总结 前言 在图形界面设计中&#xff0c;直线绘制是非常常见且重要的功能之一&#xff0c;尤其是在需要进行图形表示、…...

区块链概念 Web 3.0 实操

1. Web 3.0 概述 1.1 定义与背景 Web 3.0&#xff0c;也称为第三代互联网&#xff0c;是一个新兴的概念&#xff0c;它代表着互联网的未来发展和演进方向。Web 3.0的核心理念是去中心化、用户主权和智能化。这一概念的提出&#xff0c;旨在解决Web 2.0时代中用户数据隐私泄露…...

【人工智能】大数据平台技术及应用

文章目录 前言一、大数据平台基本概念及发展趋势1、数据量爆发式增长&#xff0c;发数据蓬勃发展2、大数据到底是什么&#xff1f;3、大数据处理与传统数据处理的差异4、为什么要建立大数据平台&#xff1f;5、大数据平台开源架构-Hadoop6、华为云大数据平台架构 二、大数据技术…...

Scala的模式匹配(7)

package hfdobject Test35 {case class Person(name:String)case class Student(name:String,className:String)//match case 能根据 类名和属性的信息&#xff0c;匹配到对应的类//注意&#xff1a;//1 匹配的时候&#xff0c;case class的属性个数要对上//2 数学名不需要一一…...

listmonk CI/CD安全扫描集成:在部署前发现漏洞

listmonk CI/CD安全扫描集成&#xff1a;在部署前发现漏洞 邮件营销系统作为企业与用户沟通的重要渠道&#xff0c;其安全性直接关系到用户数据保护和品牌声誉。根据行业统计&#xff0c;超过68%的邮件系统漏洞是在生产环境中被发现的&#xff0c;而此时修复成本已增加10倍以上…...

超越基础扫描:实战解析Tessent ATPG中的Clock PO与RAM Sequential Patterns如何提升故障覆盖率

超越基础扫描&#xff1a;实战解析Tessent ATPG中的Clock PO与RAM Sequential Patterns如何提升故障覆盖率 在数字电路测试领域&#xff0c;达到95%以上的故障覆盖率曾是许多DFT工程师的终极目标&#xff0c;直到他们遇到了时钟驱动输出和嵌入式RAM模块。这些特殊结构如同电路…...

终极指南:3步彻底解决腾讯游戏ACE-Guard卡顿,免费提升游戏性能

终极指南&#xff1a;3步彻底解决腾讯游戏ACE-Guard卡顿&#xff0c;免费提升游戏性能 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 你是否在玩《英雄联…...

Arch Linux Hyprland自动化安装脚本:高效打造现代化Wayland桌面环境

Arch Linux Hyprland自动化安装脚本&#xff1a;高效打造现代化Wayland桌面环境 【免费下载链接】Arch-Hyprland For automated installation of Hyprland on Arch Linux or any Arch Linux-based distros 项目地址: https://gitcode.com/gh_mirrors/ar/Arch-Hyprland A…...

揭秘qmc-decoder:三步解锁QQ音乐加密音频的终极指南

揭秘qmc-decoder&#xff1a;三步解锁QQ音乐加密音频的终极指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经下载了心爱的QQ音乐歌曲&#xff0c;却发现只能在…...

别再只盯着wx.login了!SpringBoot后端实战:用getPhoneNumber接口搞定小程序用户手机号绑定

微信小程序用户手机号绑定&#xff1a;SpringBoot后端深度实践指南 在当今移动互联网生态中&#xff0c;微信小程序已成为连接用户与服务的重要桥梁。对于需要强实名认证或直接触达用户的业务场景&#xff08;如电商交易、金融服务、政务办理等&#xff09;&#xff0c;仅依赖w…...

Excel MCP Server终极指南:让AI成为你的Excel自动化助手

Excel MCP Server终极指南&#xff1a;让AI成为你的Excel自动化助手 【免费下载链接】excel-mcp-server A Model Context Protocol server for Excel file manipulation 项目地址: https://gitcode.com/gh_mirrors/ex/excel-mcp-server 你是否厌倦了重复的Excel操作&…...

3个按键冲突场景,Hitboxer如何帮你重获游戏控制权?

3个按键冲突场景&#xff0c;Hitboxer如何帮你重获游戏控制权&#xff1f; 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对战中&#xff0c;因为同时按下W和S键而突然卡住&#xff1f;或…...

如何快速提升游戏帧率:OpenSpeedy游戏加速优化终极指南

如何快速提升游戏帧率&#xff1a;OpenSpeedy游戏加速优化终极指南 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否厌倦了游戏卡顿和掉帧&#xff1f;OpenSpeedy是一款…...

技术解构:逆向工程视角下的百度网盘下载链接解析机制

技术解构&#xff1a;逆向工程视角下的百度网盘下载链接解析机制 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 想象一下&#xff0c;当你收到朋友分享的百度网盘链接时&…...